Android消息机制Handler用法有哪些

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

本文主要讲解“安卓消息机制Handler有哪些用法”。本文的解释简单明了,易学易懂。请跟随边肖的思路,一起学习学习《安卓消息机制Handler有哪些用法》!

1.简述

处理程序消息机制主要包括:MessageQueue、Handler、Looper和Message。

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

MessageQueue:消息队列,但它的内部实现不是使用的队列,而是单链表的数据结构来维护消息列表,因为单链表在插入和删除方面都有优势。主要功能是向消息池(MessageQueue.enqueueMessage)发布消息,并从消息池(MessageQueue.next)获取消息。

Handler:消息辅助类,主要功能是将各种消息事件(handler . sendmail)发送到消息池,并处理相应的消息事件(handler . handler message);

Looper:消息控制器,它连续循环(Looper.loop),从MessageQueue中读取消息,并根据分发机制将消息分发到目标处理器。

2.异步线程切换原理

classLooperThreadextendsThread {

publicHandlermHandler

public void run(){ 0

looper . prepare();

mhhandler=new handler(){ 0

public void handlemessage(Messagemsg){ 0

//processincomingsmessageshere

}

};

looper . loop();

}

}每个异步线程维护一个唯一的Looper。每个循环程序将初始化(维护)一个消息队列,然后进入一个无限循环来读取存储在消息队列中的消息。如果没有消息,它将阻塞并等待。

在实例化Handler的过程中,我们将首先获取当前线程的looper对象,然后获取Looper对象对应的MessageQueue。请注意,源处理程序保存循环程序和消息队列。

privatedstativychandlecallback(Messagemessage){ 0

message .回调. run();

}

finalLoopermLooper

finalMessageQueuemQueue

finallycallbackmcallback;当我们发送一条消息时,即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.总结

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

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

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

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

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

  • 6.Handler内存泄漏的原因

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

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

public class SampleActivity extends Activity {
 
  /**
   * Instances of static inner classes do not hold an implicit
   * reference to their outer class.
   */
  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);
 
  /**
   * Instances of anonymous classes do not hold an implicit
   * reference to their outer class when they are "static".
   */
  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用法有哪些这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/126257.html

(0)

相关推荐

  • swingworker处理中间结果的方法(swing项目实例)

    技术如何实现SwingWorker的实例化本篇文章给大家分享的是有关如何实现SwingWorker的实例化,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Sw

    攻略 2021年12月24日
  • 骠勇读音,brothers怎么读

    技术骠勇读音,brothers怎么读brother的读音为英 [ˈbrʌðə(r)] 美 [ˈbrʌðɚ] 骠勇读音。具体释义如下: brother 英 [ˈbrʌðə(r)] 美 [ˈbrʌðɚ] 1、名词 n.兄弟;

    生活 2021年10月29日
  • DIV+CSS网页内容显示不完整诊断是这样的

    技术DIV+CSS网页内容显示不完整诊断是这样的DIV+CSS网页内容显示不完整诊断是这样的,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。本文和大家重点

    攻略 2021年11月11日
  • python都应用于什么领域

    技术python都应用于什么领域这篇文章主要介绍“python都应用于什么领域”,在日常操作中,相信很多人在python都应用于什么领域问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”pyt

    攻略 2021年10月30日
  • IE7.JS怎样解决IE兼容性问题

    技术IE7.JS怎样解决IE兼容性问题这篇文章给大家介绍 IE7.JS怎样解决IE兼容性问题,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。和大家重点讨论一下如何使用IE7.JS解决IE兼容性问题,I

    攻略 2021年11月25日
  • 排比句的例子,用一组排比句表述自己的志向事例

    技术排比句的例子,用一组排比句表述自己的志向事例1排比句的例子、弱者只有千难万难,而勇者则能披荆斩棘;愚者只有声声悲叹,智者却有千路万路。2、你可以不高贵,但不能无耻;你可以不伟大,但不能卑劣;你可
    以不聪慧,但不能糊涂

    2021年10月26日