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 程式完全陌生,找到一個寫法很簡潔的範例,因此將程式碼收藏下來以便於往後參考之用。
    二、程式碼來源


範例下載

沒有留言: