1. 程式人生 > 實用技巧 >Android Handler 常用方法

Android Handler 常用方法

前言

本文簡記 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