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();
    
  • 但是这样的写法已经被弃用了。

避免内存泄露

  • 上一点最简单的写法会造成内存泄露,使得程序或系统崩溃,以及存在安全隐患。
  • 这里记录相对来说比较好理解、相对简单的写法,更多的方法看文档。

继承 Handler 的静态子类

  • 示例:

    首先在实现子线程 new Thread() 的方法外写一个继承 Handler 的静态子类:

    private static class HandlerMsg extends Handler {
    	@Override
    	public void handleMessage(@NonNull Message msg) {
    		super.handleMessage(msg);
    		switch (msg.what) {
    			case 10001:i
    				Log.i(">>>>==== 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
    

Handler 对象回调

  • 可以使用 Callback() 实现 线程间的即时数据通信。

  • 示例:

    threadSendMsg() 可以不变化,setHandler() 可在 onCreate() 中调用。

    public class MainActivity extends AppCompatActivity {
    	......
    	Handler handler;
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    		......
    		setHandler();
    		......
    	}
    
    	/**
    	 * 初始化 handler
    	 */
    	private void setHandler() {
    		handler = new Handler(new Handler.Callback() {
    			@SuppressLint("LongLogTag")
    			@Override
    			public boolean handleMessage(@NonNull Message message) {
    				switch (message.what) {
    					case 1001:
    						Log.d(">>>>==== GET HandlerMsg ====<<<< : ", "msg.what = "+msg.what+", obj = "+(String)msg.obj);
    						break;
    					default:
    						throw new IllegalStateException("Unexpected value: " + message.what);
    				}
    				return false;
    			}
    		});
    	}
    
    	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();
    	}
    }
    

Android Handler 常用方法

上一篇:Convolution_model_Application_v1a


下一篇:SEO技巧:如何防止关键词排名下降