Android Handler 机制总结

 写 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抽出去,也同样达到效果的小栗子:

首先创建一个类,通过泛型将实例传入

50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信