`
阿尔萨斯
  • 浏览: 4180059 次
社区版块
存档分类
最新评论

Handler运行机制

 
阅读更多

版权声明:以前的Blog文章合并。原创作品,谢绝转载!否则将追究法律责任。


首先。这些都是从网上跟自己的总结,涉及文章不止一篇 也不是全抄 如有错误 请留言 多谢。

主要接受子线程发送的数据, 并用此数据配合主线程更新UI.因为Android 是线程不安全的。

关键词

  android.os.Handler 、 android.os.Handler.Callback

  Looper、

  Threadle、Runnable

  Message、Message queue


1.Handler sendMessage 与 obtainMessage ().sendToTarget()

Message本身带有属性

Message msg = new Message()

msg.what = xxx;//标识

msg.arg1 = xxx;//可选,用于传轻量级Integer对象。

msg.arg2 = xxx;//可选,用于传轻量级Integer对象。

msg.obj = xxx;//任意对象

msg还有个可以设置Bundle的方法:msg.setData(b);Bundle b = msg.getData();

对于Bundle可以设置多个值在多次传递后一次取出的性能优化。可见Bundle也很强大。

handler.sendMessage(msg);

这样能做到我们的需求。

obtainMessage 用于获取连接池中的对象Message并把标识与任意对象传给Handler所在的线程,

sendToTarget 底层实现sendMessage方法,这样做可以减少Message创建时的性能开销。

2. Handler中分发消息的一些方法

post(Runnable) 
postAtTime(Runnable,long) 
postDelayed(Runnable long) 
sendEmptyMessage(int) 
sendMessage(Message) 
sendMessageAtTime(Message,long) 
sendMessageDelayed(Message,long)

以上post方法允许你排列一个Runnable对象到主线程队列中,因此它并不是新开一个线程。

sendMessage方法, 允许你安排一个带数据的Message对象到队列中,等待更新.

3.Handler.callback接口实现handlerMessage()用来分发线程的任务。主线程可以直接继承该接口然后实现handlerMessage而不是实现handler重写handlerMessage()。

4.Handler的实现原理

Handler.sendMessage()后。会把Message对象放入一个MessageQueue队列,该队列属于某个Looper对象,每个Looper对象通过ThreadLocal.set(new Looper())跟一个Thread绑定了,Looper对象所属的线程在Looper.Loop方法中循环执行从MessageQueue队列读取Message对象,

并把Message对象交由Handler处理,调用Handler的dispatchMessage方法。


public void dispatchMessage(Message msg) { 
        if (msg.callback != null) { 
            handleCallback(msg); 
        } else { 
            if (mCallback != null) { 
                if (mCallback.handleMessage(msg)) {//handleMessage-1 
                    return; 
                } 
            } 
            handleMessage(msg);//handleMessage-2 
        } 
    } 
 
private final void handleCallback(Message message) { 
        message.callback.run();//callback为RUNNABLE 
}


也就是说 当我们在创建Handler的时候,并sendMessage的时候Handler必须已经存在了。

而我们在post的时候。操作是在runnable里的handleCallback,代码如上。

5.非主线程产生Can't create handler inside thread that has not called Looper.prepare()

这是因为在主线程已经有 Looper.prepareMainLooper();和Looper.loop();对操作进行处理了。

Looper.prepareMainLooper:新建了一个looper对象,并与当前进程进行了绑定

Looper.loop:线程建立消息循环机制,循环从MessageQueue获取Message对象,调用

msg.target.dispatchMessage(msg);进行处理msg.target在myThreadHandler.sendEmptyMessage(0)

设置进去的,因为一个Thead中可以建立多个Hander,通过msg.target保证MessageQueue中的每个msg 交由发送message的handler进行处理,而在Handler创建的时候会自动获取当前线程的Looper(只有主线程ActivityThread创建才有,我们创建的线程没有),如果不存在则报错。

解决:

可在我们创建的线程里创建Looper.(Looper.perpare())

Looper.myLooper().loop();//建立一个消息循环,该线程不会退出





分享到:
评论

相关推荐

    Handler机制及原理探究.pdf

    Handler使用简单功能强大,常被用作线程间传递消息的组件,而且还可以用于跨进程。 消息机制背后有包括Looper ,MessageQueue管理和分发消息的实现,...这里从Java层开始深入探究下Handler和消息机制背后实现的原理

    Android Handler机制实例

    Android Handler机制实例,测试可运行,适合初学handler机制者

    Android 用handler机制联网获取图片.zip

    Android 用handler机制联网获取图片能在实体机和虚拟机上运行,无广告,多次点击会造成主线程阻塞,出现anr;未实现联网获取图片的功能。

    handler详解

    handler详解,详解详细介绍其运行机制,相信对初学者一定有帮助

    Handler+Service+Broadcast+ListView的综合使用

    一个将Handler+Service+Broadcast+ListView一起综合起来使用的工程,可以帮助更熟练的使用Service和Broadcast以及ListView,对Handler的了解及运行机制更深入的了解~

    使用C++11实现Android系统的Handler机制

    以Java语言为例,我们可以直接new一个Thread对象,然后覆盖run方法,最后调一下start方法便可以成功运行一个线程。如果我们每次异步做一些耗时处理都单独开启一个线程,比如异步加载网络图片这种高并发操作,每张...

    Android的消息机制

    Android的消息机制主要是指Handler的运行机制,那么什么是Handler的运行机制那?通俗的来讲就是,使用Handler将子线程的Message放入主线程的Messagequeue中,在主线程使用。 二、学习内容 学习Android的消息机制,...

    PHP之autoload运行机制实例分析

    本文较为深入的分析了PHP的autoload运行机制。对于深入理解PHP运行原理有一定的帮助作用。具体分析如下: php实现autoload有两种方法: 1、拦截器__autoload() 2、设置全局变量函数指针autoload_func为指定函数。...

    android的消息处理机制(图文+源码分析)—Looper/Handler/Message

    写的非常好,深入浅出;android的消息处理机制(图+源码分析)—Looper,Handler,Message是一位大三学生自己剖析的心得,感兴趣的朋友可以了解下哦,希望对你有所帮助

    Android开发之通信方式之Handler

    UI的更新只能通过Main thread来进行(在Android中,子线程是不能直接改变UI界面的,这是Android的运行机制里面规定的,如果在子线程中改变主线程界面的文本,比如tv.setText(“XXX”),程序会马上蹦掉) ✓ **那么...

    代码分析Android消息机制

    所以我们常使用Handler来实现线程间的消息传递,这里讨论的也就是Handler的运行机制。 Handler的运行主要由两个类来支撑:Looper与MessageQueue。熟悉开发的朋友都知道在子线程中默认是无法创建Handler的,这是因为...

    XHandler:XHandler, handler的正确使用姿势与消息传递机制

    XHandler XHandler,handler的正确使用姿势与消息传递机制多线程和任务运行是老话题。 Java本身具有java.util.concurrent包和Fork / Join框架来简化它。 已经编写了一些库来简化异步操作。 RxJava是当今最流行的用于...

    chef-handler-jenkins_notifier

    Chef::Handler::JenkinsNotifier Chef-handler-jenkins_notifier gem 是一种 Chef 报告机制,可将故障发送到 Jenkins 外部作业。安装将此行添加到应用程序的 Gemfile 中: gem 'chef-handler-jenkins_notifier'然后...

    尚硅谷_MyBatis.docx

    MyBatis配置文件编写,MyBatis动态SQL,MyBatis缓存机制,MyBatis-Spring整合,MyBatis逆向工程,MyBatis高级内容(MyBatis源码解析,MyBatis单/多插件运行机制,MyBatis四大对象工作原理,自定义TypeHandler、...

    Android网络编程 非常适合入门

    Android网路编程代码 设计客户端和服务器端通信 适合初学者学习 当然其中包括很多其他知识点 例如基于handler的主副线程通信机制 多线程应用等 另外 对于Android入门的学习者 也是一手极好的学习资料 下载即可运行 ...

    jQueryZeptoPlugstimerHandler定时器插件

    jQuery/Zepto timerHandler 定时器插件支持动态注册管理,支持已ms/s/m/h时间设置间隔周期时间、暂停、限制运行次数及自动销毁机制

    源码分析Android的消息机制

    ​Android消息机制主要指的是Handler的运行机制,是一块很有意思,也很有研究意义的内容。本文计划在较短的篇幅内,通过一定的源码,分析Android消息机制,并在结尾说点”题外话“,帮助我们理解消息机制在安卓应用...

    Android-System-Related-Charts:各种与Android系统相关的框架图、流程图

    运行机制handler机制时序图handler机制UML类图应用框架相关四大组件Activity的生命周期Activity间的数据交互Fragment的声明周期service的生命周期UI相关View中widgets相关类的继承关系Android事件分发机制Android...

    Android应用程序消息处理机制

    Android应用程序与传统的PC应用程序一样,都是消息驱动的。也就是说,在Android应用程序主线程中,所有函数都是在一个...掌握Android应用程序消息处理机制,有助于我们熟练地使用同步和异步编程,提高程序的运行性能

Global site tag (gtag.js) - Google Analytics