写 Handler 原理的文章很多,就不重复写了,写不出啥新花样。这篇文章的主要是对 handler 原理的总结。
1、Android消息机制是什么?
Android消息机制 主要指 Handler 的运行机制以及 Handler 所附带的 MessageQueue 和 Looper 的工作流程。Handler 的主要作用是将任务切换到指定线程去执行,我们常用的就是通过 Handler 来异步更新UI(线程间的信息传递)。
2、Handler 使用方法
1、创建一个 Handler 实例用来发送接收并处理消息
Handler myHandler = new Handler() { public void handleMessage(Message msg) { switch (msg.what) { case TestHandler.GUIUPDATEIDENTIFIER: myBounceView.invalidate(); break; } super.handleMessage(msg); } }; myHandler.post(run); myHandler.sendEmptyMessage(TestHandler.GUIUPDATEIDENTIFIER); myHandler.sendMessage(myHandler.obtainMessage());
上面最后三行都是发送消息,你也可以在其他线程发消息,然后在主线程接收,处理 UI 逻辑;
2、如果你需要在某个线程来处理消息,那也是可以的:
new Thread(new Runnable() { @Override public void run() { Looper.prepare(); mLooper = Looper.myLooper(); mHandler = new Handler() { @Override public void handleMessage(Message msg) { Log.d(TAG, "handleMessage: " + msg.what); } }; Looper.loop(); } }).start();
这里 Looper 让该线程一直在运行,从而通过消息循环机制获取从其他线程发来的消息,传给 Handler 来处理。
如下,你在下面的线程中发送一个消息,上面的 Handler 就会收到:
new Thread(new Runnable() { @Override public void run() { if (mLooper != null) { mHandler.sendEmptyMessage(123456); Log.d(TAG, "sendMessage: " + 123456); } } }).start();
这样似乎也可以达到两个线程互相通信的效果。
3、Handler 不正确使用引发的内存泄露
容易造成内存泄漏的一种Handler使用方法:将 Handler 声明为 Activity 的内部类。在Java语言中,非静态内部类会持有外部类的一个隐试引用,这样就可能造成外部类无法被垃圾回收。而导致内存泄漏。
那么正确的使用就是:
- 将 Handler 声明为静态内部类。并持有外部类的若引用。
- 在子线程中使用 Handler,这是需要我们自己创建一个 Looper 对象。
具体可参考文章:Android Handler正确使用姿势
其中该文的第二种方法贴下,我也是第一次看到:
将自定义Handler抽出去,也同样达到效果的小栗子:
首先创建一个类,通过泛型将实例传入

