簡易計時器程式--多執行緒和例外處理

2020-10-29 12:01:07

題目描述:

按下啟動按鈕,計時器啟動,每隔一秒更新到TextView中,直到按下停止按鈕。

介面:

介面展示

程式碼:

package dhu.cst.liyiqing181310505.chp401;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import java.util.Locale;

public class MainActivity extends AppCompatActivity {

    Boolean Stop;
    Button Start;
    Button End;
    TextView txt;
    //這裡必須初始化,不然執行的時候紀錄檔會報錯
    testHandler handler = new testHandler();
    testTread thread = new testTread();

    Integer count=0;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Start=findViewById(R.id.Start);
        End=findViewById(R.id.End);
        txt=findViewById(R.id.textView);
        //介面重寫的函數呼叫
        Start.setOnClickListener(new onStart());
        End.setOnClickListener(new onEnd());
    }
    //介面
    private class onStart implements View.OnClickListener{
        @Override
        public void onClick(View view) {
            Stop =false;
            thread.start();
        }
    }
    private class onEnd implements View.OnClickListener {
        @Override
        public void onClick(View view) {
            Stop = true;
        }
    }
    //繼承
    private class testTread extends Thread {
        @Override
        public void run() {
            while (!Stop) {
                try {
                    Thread.sleep(1000);
                } catch (Exception e) {
                    //在命令列列印異常資訊在程式中出錯的位置及原因。
                    e.printStackTrace();
                }
                Message msg = new Message();
                //給成員變數what賦值,接受訊息也就是在handleMessage裡可以通過判斷傳入的值不同,做不同的操作
                msg.what = 1;
                //傳送訊息
                handler.sendMessage(msg);
            }
        }
    }
    private class testHandler extends Handler {
        @Override
        //handleMessage接收訊息
        public void handleMessage(@NonNull Message msg) {
            if (msg.what==1) {
                count ++;
                txt.setText(String.format(Locale.getDefault(),"%d",count));
            }
        }
    }
}

tips:

  1. 執行緒的 run() 和 Start() 的區別
    詳細見:

    https://www.cnblogs.com/zhaosq/p/10564698.html

    https://blog.csdn.net/QQ2899349953/article/details/81772104

  2. findViewById一定要用「=」不要用「.」,雖然用「.」在介面內不報錯,但是執行的時候會報錯。