iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Android消息机制Handler用法有哪些
  • 345
分享到

Android消息机制Handler用法有哪些

2023-06-21 20:06:57 345人浏览 薄情痞子
摘要

这篇文章主要讲解了“Android消息机制Handler用法有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Android消息机制Handler用法有哪些”吧!1.简述Handler消息

这篇文章主要讲解了“Android消息机制Handler用法有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Android消息机制Handler用法有哪些”吧!

1.简述

Handler消息机制主要包括: MessageQueue、 Handler、 Looper、Message。

  • Message:需要传递的消息,可以传递数据;

  • MessageQueue:消息队列,但是它的内部实现并不是用的队列,而是通过单链表数据结构来维护消息列表,因为单链表在插入和删除上比较有优势。主要功能是向消息池投递消息( MessageQueue.enqueueMessage)和取走消息池的消息( MessageQueue.next)。 

  • Handler:消息辅助类,主要功能是向消息池发送各种消息事件( Handler.sendMessage)和处理相应消息事件( Handler.handleMessage); 

  • Looper:消息控制器,不断循环执行( Looper.loop),从MessageQueue中读取消息,按分发机制将消息分发给目标处理者。

2.异步线程切换原理

class LooperThread extends Thread {      public Handler mHandler;       public void run() {          Looper.prepare();           mHandler = new Handler() {              public void handleMessage(Message msg) {                  // process incoming messages here              }          };           Looper.loop();      }  }

每一个异步线程,都维护着唯一的一个Looper,每一个Looper会初始化(维护)一个MessageQueue,之后进入一个无限循环一直在读取MessageQueue中存储的消息,如果没有消息那就一直阻塞等待。

我们在实例化handler的过程中,会先得到当前所在线程的looper对象,之后得到与该looper对象相对应的消息队列,看源码Handler中持有Looper、MessageQueue。

private static void handleCallback(Message message) {        message.callback.run();    }     final Looper mLooper;    final MessageQueue MQueue;    final Callback mCallback;

当我们发送消息的时候,即handler.sendMessage或者handler.post,会将msg中的target赋值为handler自身,这就是实现message从一个线程到另外一个线程的传递的本质,之后加入到消息队列中。

private boolean enqueueMessage(MessageQueue queue, Message msg, long uptimeMillis) {    msg.target = this;    if (mAsynchronous) {        msg.setAsynchronous(true);    }    return queue.enqueueMessage(msg, uptimeMillis);}

我们一般会重写handlerMessage方法处理消息,这将会在msg.target.disPatchMessage方法中被回调,从而实现了message从一个线程到另外一个线程的传递。

3.总结

  • Handler 的背后有 Looper、MessageQueue 支撑,Looper 负责消息分发,MessageQueue 负责消息管理;

  • 在创建 Handler 之前一定需要先创建 Looper,Looper 有退出的功能,但是主线程的 Looper 不允许退出;

  • 异步线程Looper,Looper.prepare()创建Looper,Looper.loop()开始轮询,需要自己调用 Looper.myLooper().quit()退出;

  • Runnable 被封装进了 Message,可以说是一个特殊的 Message;

  • Handler.handleMessage() 所在的线程是 Looper.loop() 方法被调用的线程;

  • Handler内存泄漏的原因

原因:MessageQueue持有Message,Message持有activity,delay多久,message就会持有activity多久。

解决方案:静态内部类、弱引用,最后不要忘记调用Handler.removeCallbacksAndMessages(null)清空所有消息。

public class SampleActivity extends Activity {     private static class MyHandler extends Handler {    private final WeakReference<SampleActivity> Mactivity;     public MyHandler(SampleActivity activity) {      mActivity = new WeakReference<SampleActivity>(activity);    }     @Override    public void handleMessage(Message msg) {      SampleActivity activity = mActivity.get();      if (activity != null) {        // ...      }    }  }  // MyHandler private final MyHandler mHandler = new MyHandler(this);     private static final Runnable sRunnable = new Runnable() {      @Override      public void run() {  }  };   @Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);     // Post a message and delay its execution for 10 minutes.    mHandler.postDelayed(sRunnable, 1000 * 60 * 10);        // Go back to the previous Activity.    finish();  }   @Override  protected void onDestroy() {        super.onDestroy();        //mHandler.removeCallbacksAndMessages(null);    }}

感谢各位的阅读,以上就是“Android消息机制Handler用法有哪些”的内容了,经过本文的学习后,相信大家对Android消息机制Handler用法有哪些这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: Android消息机制Handler用法有哪些

本文链接: https://www.lsjlt.com/news/300660.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作