星期三, 5月 10, 2017

[Android] Thread 和 Message 關係 (更新UI畫面)


在UI上如果要處理一些耗時的程序時,
如果都是放在onCreate裡去做,
那超過十秒的話,UI就會出見"ANR"的錯誤訊息,
因為UI不允許頁面hang住這麼久,
所以我們就需要把耗時的程序丟去thread去做。

先宣告一個thread,
而thread內放個"runnable"物件,


Thread t;

t = new Thread(run);

runnable物件是在定義要做什麼事,
所以把要執行的程式碼包在"run"這個function內。


private Runnable run = new Runnable() { }

而要執行的程式在runnable內跑時,
他不能直接的更改UI的內容。
會出現error message
像是使用setText()來更改text的內容。
因為ui的內容只允許main thread來更改,
而runnable是產生的副thread,

所以要利用message的方式來溝通,
傳遞message的方式是利用handler物件,


Handler mHandler;

mHandler = new Handler(){

}

在runnable內,先宣告message物件,
他是要拿來打包內容,並且傳遞給handler做處理,


Message msg = new Message();

msg.what = 1;

mHandler.sendMessage(msg);

然後在handler裡就可以接收這個message,
並且判斷what這個值。


public void handleMessage(Message msg) {
  switch(msg.what){

  }

}

最後在handleMessage內來處理更改ui的動作。

SampleCode

Ref

沒有留言: