<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="40dp"
android:textSize="30dp"
android:text="TextView" />
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="40dp"
android:textSize="30dp"
android:text="TextView" />
<ProgressBar
android:id="@+id/progressBar1"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="시작" />
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="정지" />
</LinearLayout>
package com.gusfree.thread;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
public class ThreadActivity extends Activity {
TextView tv1,tv2;//선언
Button btn1, btn2;
ProgressBar pb;
MyHandler handler = new MyHandler();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//클래스 변수 초기화
tv1=(TextView) this.findViewById(R.id.textView1);
tv2=(TextView) this.findViewById(R.id.textView2);
btn1=(Button) this.findViewById(R.id.button1);
btn2=(Button) this.findViewById(R.id.button2);
pb=(ProgressBar)this.findViewById(R.id.progressBar1);
pb.setProgress(0);//진행정도 setting하기
//버튼에 리스너 셋팅 callBack메서드 셋팅
ButtonListener listener = new ButtonListener();
btn1.setOnClickListener(listener);
btn2.setOnClickListener(listener);
}
class ButtonListener implements OnClickListener{
@Override
public void onClick(View v) {
switch(v.getId()){
case R.id.button1 :
Plus plus1 = new Plus();//스레드 겍체 생성
plus1.start();//run()안에 적어둔 일을 해라
break;
case R.id.button2 :
Plus2 plus2 = new Plus2();
plus2.start();// 스레드 생성+ 일시작
tv1.setText(0+"");
//Toast.makeText(this, "완료", 2000).show();
break;
}
}
}
//innerClass 사용목적 :
//OutterClass의 변수를 자율롭게 사용하기 위해
class Plus extends Thread{
@Override
public void run() {//스레드가 할 일을 적어두는 곳
android.util.Log.i("버튼 1클릭","버튼 1클릭");//import가 필요없다.
/*1~100 숫자를 textview에 찍자*/
for(int i=0;i<=100;i++){
//서브스레드는 View에 접근할 수 없다.
//tv1.setText(i+"");//Error
//대안:핸들러에게 View에 접근하는일 시키자
//send~~Message : handleMessage호출
Log.i("sendEmptyMessage","sendEmptyMessage"+i);
handler.sendEmptyMessage(i);
try{
Thread.sleep(50);//0.05초 *100=5
}catch(InterruptedException e){
e.printStackTrace();
}
}
}
}
//inner Class:서브스레드로부터 지시를 받아서 뷰 수정
class MyHandler extends Handler{
@Override
public void handleMessage(Message msg) {
Log.e("handleMessage","handleMessage");
int number=msg.what;
int number2=msg.what;
if(number2==777){
Toast.makeText(ThreadActivity.this,"in Handler 작업 끝",1).show();
}else{
tv1.setText(number+"핸들러가 찍습니다.");
}
super.handleMessage(msg);
}
}
//ProgressBar 조금씩 올려주는 쓰레드
class Plus2 extends Thread{
@Override
public void run() {
//Toast.makeText(ThreadActivity.this, "in Thread", 0).show();//error
for(int i=0;i<=100;i++){
pb.setProgress(i);//된다!
if(i==100){
//핸들러에게 Toast를 시킨다
handler.sendEmptyMessage(777);
pb.setProgress(0);
}
try{
Thread.sleep(50);
}catch(InterruptedException e){
e.printStackTrace();
}
}
}
}
}