PROGRAMMING WORKSHOP

Android|
Thread | Button

앞 페이지에서 Image를 다운 받는 과정에서 별도의 Thread를
활용하여 부드럽게 그림화일이 받아 졌었다
Thread에서 좀더 알아 보도록 하자
안드로이드에서 Thread 개체를 잘 활용하지 못하면 단팥없는 찐빵이 된다
그냥 화면에 버튼을 하나 만들고,
버튼을 크릭하면 1에서 부터 100까지 순환하면서
버튼의 Text에 1, 2, 3, ,,,, 100까지 부드럽게 나타나게 하고 싶다고 치면
그냥 단순히..
그냥 순환하면서 Button의 Text값을 순환변수값을 그대로 전달하면
되지 않겠어????
이것이 그렇지 않다는 것이다
Thread = Multi Tasking이라고 생각하시면 된다
하나의 화면이 열렸다가 닫히는 과정은
기본적으로 하나의 Thread로 시작하여 하나의 Thread, 즉 여러개의 Thread가
아닌 단 하나의 Thread로 일을 하는 것이다
이 하나의 Thread는 눈에 보이지 않는 잡다한 일들을
순차적으로 진행하고 있는 것이다
중간에 다른 일을 시키면 ,
순환할때마다 버튼에 값이 전달되기를 기대했는데..
어라 순환계산은 빽단(Back-end)에서 다 하고 최종 값만 나타난다
아래의 것을 실행시켜 보시기 바란다
이것도 XML 레이아웃화일 없이 java 크래스화일만 갖고 실행한다

public class MainActivity_12 extends Activity {
	Button button;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        LinearLayout ll = new LinearLayout(this);
        ll.setGravity(Gravity.CENTER);
        button = new Button(this);
        button.setText("Click Me!!");
        button.setWidth(600);
        button.setHeight(150);
        button.setTextSize(20);
        ll.addView(button);
        setContentView(ll);
		
        button.setOnClickListener(new OnClickListener(){
			public void onClick(View v) {
				for(int i=0;i<100;i++){
					button.setText(String.valueOf(i));
				}
			}
		});     
    }    
}

1에서 100까지 후루룩 순환을 돌고 중간숫자는 버튼에 나타나지 않고
최종순환값만 나타난다..
당연하지...VBA에서도 순환이 너무 빨라서 눈에 보이지 않았었으니까???
중간에 시간을 끄는 것을 주면 되겠네
그래서 다시 아래와 같이 Thread개체를 활용하여
시간을 끄는 일을 해본다
실행해 보시기 바란다.

public class MainActivity_12 extends Activity {
	Button button;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        LinearLayout ll = new LinearLayout(this);
        ll.setGravity(Gravity.CENTER);
        button = new Button(this);
        button.setText("Click Me!!");
        button.setWidth(600);
        button.setHeight(150);
        button.setTextSize(20);
        ll.addView(button);
        setContentView(ll);
		
        button.setOnClickListener(new OnClickListener(){
			public void onClick(View v) {
				for(int i=0;i<100;i++){
				
					try {
						Thread.sleep(100);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}				
					button.setText(String.valueOf(i));
				}
			}
		});     
    }    
}

어라...
시간만 더 걸릴뿐 역시 최종 결과값만 버튼의 Text에
나타난다..

Thread.sleep(100); 이라고 작성하면 경고표시가 나타난다
마우스를 살짝 갖다 대면 ..Try~Catch문으로 감싸주라는
지시가 있다, 이것을 크릭해주면 자동으로 작성되는 것이라는 점..기억하시고
java코딩을 할때는 항상 밑줄에 물결표시등이 나타나면 항상
마우스를 갖다대고 설명문을 보시고 해결하시면 된다

Java라는 녀석 자체가
하나의 Thread에서 하는 일이 그렇게 하게 생겨 먹은 것이다
계산은 계산이고(순환문을 도는 것..)
순환을 돌때마다 버튼에 값을 전달하는 것은
내일이 아니다!! 라고 계산만 돌린 셈이다
그러고 최종 값만 전달한다..
이상하게 보일 것 같지만, Java의 나름대로의 효율을 생각하여
만들어낸 그들의 방식인 것이다

그럼 부드럽게 매번...순환할때마다 착실하게 버튼에 값을
전달하게 하려면..일 하는 라인을 하나 더 구축해야 하는 것이다
창구를 하나 더 만들어서
계산은 내가 할테니까, 다른 창구는 열심히 버튼에
값을 옮겨라!!!
그래서 별도의 Thread를 구축, 즉 공장에서 생산라인을
하나 더 구축하는 셈이다
아래와 같이 Thread를 만들어서 하면 제대로 한것이 된다

public class MainActivity_12 extends Activity {
	Button button;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        LinearLayout ll = new LinearLayout(this);
        ll.setGravity(Gravity.CENTER);
        button = new Button(this);
        button.setText("Click Me!!");
        button.setWidth(600);
        button.setHeight(150);
        button.setTextSize(20);
        ll.addView(button);
        setContentView(ll);
        
	button.setOnClickListener(new OnClickListener(){

	public void onClick(View v) {
	
		new Thread(new Runnable(){

			public void run() {
			for(int i=0;i<100;i++){
				try {
					Thread.sleep(100);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				final int value=i;
				button.post(new Runnable(){
					public void run() {
						button.setText(String.valueOf(value+1));
					}
				});
			}
			}
		}).start();
	}
		
	});
    }
}

위의 내용을 보자 , Thread개체의 생성과 사용에 있어서..


Thread myThread = new Thread( new Runnable(){
    .....
	.....
});
myThread.start();

라고 해도 되고


new Thread( new Runnable(){
    .....
	.....
}).start();

라고 해도 된다
두번째것은 변수없이 그냥 개체생성(new)한후 start()메소드를
사용한 것..어느 것을 사용해도 상관 없다
개체를 만들고 start메소드 하나만 사용할 것이니 위와 같이
변수없이 그냥 사용하는 것도 좋은 방법일 것이다

Dim oSheet As Worksheet
Set oSheet=Worksheets.Add
With oSheet
	...
	...
End With

라고 하여도 되고..

With Worksheets.Add
	...
	...
End With

와 같이 하는 것과 마찬가지이다..

아래의 그림과 같이 첨부 화일에서 3개의 경우를 모두 해보시면
왜 Thread가 필요한지 알게 되실 것이다

***[LOG-IN]***