問題:在Android開發中,子線程無法直接更改UI界面視圖的刷新
這個時候 Handler 起到了至關重要的作用.
簡單來說 , Handler就是用來傳遞消息的.
Handler可以當成子線程與主線程的消息傳送的紐帶。
在安卓開發中,在子線程中無法刷新UI,是因為UI在子線程中刷新的話,是不安全的,如 多個線程刷新UI,會造成UI更新沖突,這樣是不安全的。
所以,Handler的作用就來了,子線程可以通過Handler來將UI更新操作切換到主線程中執行. 話不多說 上代碼:
//這里需要實現 View.OnClickListener 接口 public class Test extends AppCompatActivity implements View.OnClickListener { TextView textView; Thread myThread; Button buttonStart @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //獲取文本視圖 textView = findViewById(R.id.textView); //創建線程 myThread = new TimeThread(); //獲取開始按鈕 buttonStart = findViewById(R.id.but_start); //開始按鈕單擊事件 buttonStart.setOnClickListener(this); } //重寫onClick方法 @Override public void onClick(View v) { //判斷當前按的控件 switch (v.getId()) { case R.id.but_start: //開啟線程 myThread.start(); break; default: break; } } } public class TimeThread extends Thread { //重寫run方法 @Override public void run() { super.run(); //一直循環 while (true) { try { //每秒執行一次 Thread.sleep(1000); Message msg = new Message();
// msg.what = 1; //獲取當前系統時間 Date date= new Date(); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); String now= dateFormat.format(date);
//把時間放入Message msg.obj = now ; //由Message傳遞給Handler 處理 myHandler.sendMessage(msg); } catch (Exception e) { e.printStackTrace(); break; } } } } private Handler myHandler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case 1: //更新文本框里的值 textView.setText((String)msg.obj); break; default: break; } } };