2016年6月29日 星期三
多執行緒範例
public class MainActivity extends Activity {
private TextView timer1, timer2;
private Button start1, stop1, zero1, start2, stop2, zero2, end;
private int timesec1=0, timesec2=0, csec1=0, csec2=0, cmin1=0, cmin2=0;
// 宣告執行緒 Thread1
ClockThread1 thread1 = new ClockThread1();
// 宣告執行緒 Thread2
ClockThread2 thread2 = new ClockThread2();
// 宣告 Handler
Handler handler = new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
timer1 = (TextView)findViewById(R.id.timer1);
start1 = (Button)findViewById(R.id.start1);
stop1 = (Button)findViewById(R.id.stop1);
zero1 = (Button)findViewById(R.id.zero1);
timer2 = (TextView)findViewById(R.id.timer2);
start2 = (Button)findViewById(R.id.start2);
stop2 = (Button)findViewById(R.id.stop2);
zero2 = (Button)findViewById(R.id.zero2);
end = (Button)findViewById(R.id.end);
start1.setOnClickListener(listener);
start2.setOnClickListener(listener);
stop1.setOnClickListener(listener);
stop2.setOnClickListener(listener);
zero1.setOnClickListener(listener);
zero2.setOnClickListener(listener);
end.setOnClickListener(listener);
}
// 第一個執行緒
public class ClockThread1 extends Thread {
public void run(){
timesec1++;
csec1 = timesec1 % 60;
cmin1 = timesec1 / 60;
String s = "";
if (cmin1 < 10){
s = "0" + cmin1;
} else {
s = "" + cmin1;
}
if (csec1 < 10){
s = s + ":0" + csec1;
} else {
s = s + ":" + csec1;
}
timer1.setText(s);
//每次執行Thred1只會執行一次,必須靠延遲1秒後執行Handler來進行重複執行
handler.postDelayed(thread1, 1000);
}
}
// 第二個執行緒
public class ClockThread2 extends Thread {
public void run(){
timesec2++;
csec2 = timesec2 % 60;
cmin2 = timesec2 / 60;
String s = "";
if (cmin2 < 10){
s = "0" + cmin2;
} else {
s = "" + cmin2;
}
if (csec2 < 10){
s = s + ":0" + csec2;
} else {
s = s + ":" + csec2;
}
timer2.setText(s);
handler.postDelayed(thread2,1000);
}
}
private OnClickListener listener = new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch(v.getId()){
case R.id.start1:
//開始
handler.post(thread1);
break;
case R.id.stop1:
//停止(移除呼叫執行緒)
handler.removeCallbacks(thread1);
break;
case R.id.zero1:
timesec1 = 0;
timer1.setText("00:00");
break;
case R.id.start2:
handler.post(thread2);
break;
case R.id.stop2:
handler.removeCallbacks(thread2);
break;
case R.id.zero2:
timesec2 = 0;
timer2.setText("00:00");
break;
case R.id.end:
finish();
break;
}
}
};
}
註:
一、對 Thread 程式完全陌生,找到一個寫法很簡潔的範例,因此將程式碼收藏下來以便於往後參考之用。
二、程式碼來源
範例下載
訂閱:
張貼留言 (Atom)

沒有留言:
張貼留言