Android Handler 常用方法
阿新 • • 發佈:2020-07-08
前言
本文簡記 Handler 的常用方法。
事件計劃
-
常用
postDelayed()
方法。 -
示例:
Handler handler = new Handler(); handler.postDelayed(new Runnable() { @Override public void run() { Toast.makeText(getApplicationContext(), "3000毫秒事件計劃", Toast.LENGTH_LONG).show(); } }, 3000);
執行緒間通訊
最簡單
-
示例:
Handler handler = new Handler() { @Override public void handleMessage(@NonNull Message msg) { super.handleMessage(msg); switch (msg.what) { case 1: Toast.makeText(getApplicationContext(), "執行緒間通訊成功", Toast.LENGTH_LONG).show(); break; } } }; new Thread() { @Override public void run() { super.run(); Message message = new Message(); message.what = 1; handlerMsg.sendMessage(message); } }.start();
-
但是這樣的寫法已經被棄用了。
避免記憶體洩露
-
上一點最簡單的寫法會造成記憶體洩露,使得程式或系統崩潰,以及存在安全隱患。
-
這裡記錄相對來說比較好理解、相對簡單的寫法,更多的方法看文件。
-
示例:
首先在實現子執行緒
new Thread()
的方法外寫一個繼承 Handler 的靜態子類:private static class HandlerMsg extends Handler { @Override public void handleMessage(@NonNull Message msg) { super.handleMessage(msg); switch (msg.what) { case 10001: Log.d(">>>>==== GET HandlerMsg ====<<<< : ", "msg.what = "+msg.what+", obj = "+(String)msg.obj); break; } } }
然後在子執行緒
new Thread()
所在的方法下宣告該類的物件,再在子執行緒new Thread()
中呼叫:public void threadSendMsg() { final HandlerMsg handlerMsg = new HandlerMsg(); new Thread() { @Override public void run() { super.run(); Message message = new Message(); message.what = 10001; message.obj = "yogile"; handlerMsg.sendMessage(message); } }.start(); }
-
將
threadSendMsg()
通過按鈕控制元件觸發,執行結果:2020-07-08 19:25:39.862 5901-5901/com.yogile.running D/>>>>==== GET HandlerMsg ====<<<< : msg.what = 1, obj = yogile