线程执行android的looper,handler消息小结
2013-05-06 20:15
477 查看
时间紧张,先记一笔,后续优化与完善。
在android发开中,为了UI线程能实时应响要需免避在其中执行耗时作操,以免避界面假死甚至ANR。我们一般把耗时作操如下载,询查放在一个独自的线程中。这以后再将结果新更到UI界面。android平台在非UI线程中新更界面大致有以下几种方法:
其中面后两种方法我们用的比拟多,而AsyncTask也是基于Handler行进封装的,可以看出Handler是我们新更UI线程的利器。看下用常的Handler构造方法:
从第二个方法面里可以看出,新建一个handler象对,要主是使其final MessageQueue mQueue作用域指向一个象对,其它的作用域用默许的都行。mQueue来自mLooper = Looper.myLooper();看下myLooper()方法的实现:
到这里是时候说明下ThreadLocal了,ThreadLocal是java中为每一个线程都供给一个变量值的副本,是Java中一种较为殊特的线程定绑机制。这里我们只要记着以下几点:1.每一个线程中取得的ThreadLocal的值都是线程独立的,和其它线程没有联关。2.对于ThreadLocal的解理在记着第一点的基础上只要需记着public void set(T)和public T get()两个接口就能够。
事实上android用利ThreadLocal,为每一个UI线程建立一个looper象对,每一个looper象对有一个消息队列MessageQueue。每次声明一个handler,其要主步调就是定绑前当线程的消息队列,这以后就能够用利handler将要需的作操派发到消息队列中。一般在每一个线程的开始执行Looper.prepare();这是为前当线程建创线程私有的looper象对,这以后就能够声明handler;一般在每一个线程的最后执行Looper.loop();后面说明handler定绑了前当线程的消息队列,loop()方法就是听监消息队列,并且执行作操,因此这个方法是一个无限循环,其以后的代码都不会执行,所以在线程的最后执行。
种这式模有点像大学作操系统中的生产者和消费者式模,looper就像消费者,handler就像生产者,比拟殊特的是在一个线程中消费者looper只能有一个,生产者handler可以有多个。接下来带着面上的知识看看looper中的要主代码:
每日一道理
无知者为梦想中的虚幻而苦苦等待,换回的不是所求的,而是岁月在脸上留下的印痕,一事无成的人一生便是虚度。生活中,与其花时间去等待,不如加快步伐去追寻理想,试着与时间赛跑,也许身躯、心理会感到劳累,但这样的生活毕竟是充实的。
在序程中如果某一个子方法面里及涉到了handler而前当线程没有定绑looper(比如在某个自己新建的线程中新分配的一个象对就可能要需handler),运行时就会抛出异常:
而如果只在线程的扫尾执行Looper.prepare();而没有执行Looper.loop();就会现出很多作操不会执行的象现。:)
最后再总结下:用了久很的Handler.post(Runnable),始终没去深刻看下道理。android封装的太好了,及涉到新更UI的东东就面上说的已够用,如果有一些殊特的要需HandlerThread,AsyncTask都已帮我们封装好了。不过既然公开了源代码,还是去了解下实现道理比拟好。O(∩_∩)O~~
文章结束给大家分享下程序员的一些笑话语录:
一位程序员去海边游泳,由于水性不佳,游不回岸了,于是他挥着手臂,大声求.救:“F1,F1!”
在android发开中,为了UI线程能实时应响要需免避在其中执行耗时作操,以免避界面假死甚至ANR。我们一般把耗时作操如下载,询查放在一个独自的线程中。这以后再将结果新更到UI界面。android平台在非UI线程中新更界面大致有以下几种方法:
Activity.runOnUiThread(Runnable) View.post(Runnable) AsyncTask<Params, Progress, Result> Handler.post(Runnable)
其中面后两种方法我们用的比拟多,而AsyncTask也是基于Handler行进封装的,可以看出Handler是我们新更UI线程的利器。看下用常的Handler构造方法:
public Handler() { this(null, false); } public Handler(Callback callback, boolean async) { ..... mLooper = Looper.myLooper(); ..... mQueue = mLooper.mQueue; mCallback = callback; mAsynchronous = async; }
从第二个方法面里可以看出,新建一个handler象对,要主是使其final MessageQueue mQueue作用域指向一个象对,其它的作用域用默许的都行。mQueue来自mLooper = Looper.myLooper();看下myLooper()方法的实现:
public static Looper myLooper() { return sThreadLocal.get(); } // sThreadLocal.get() will return null unless you've called prepare(). static final ThreadLocal<Looper> sThreadLocal = new ThreadLocal<Looper>();
到这里是时候说明下ThreadLocal了,ThreadLocal是java中为每一个线程都供给一个变量值的副本,是Java中一种较为殊特的线程定绑机制。这里我们只要记着以下几点:1.每一个线程中取得的ThreadLocal的值都是线程独立的,和其它线程没有联关。2.对于ThreadLocal的解理在记着第一点的基础上只要需记着public void set(T)和public T get()两个接口就能够。
事实上android用利ThreadLocal,为每一个UI线程建立一个looper象对,每一个looper象对有一个消息队列MessageQueue。每次声明一个handler,其要主步调就是定绑前当线程的消息队列,这以后就能够用利handler将要需的作操派发到消息队列中。一般在每一个线程的开始执行Looper.prepare();这是为前当线程建创线程私有的looper象对,这以后就能够声明handler;一般在每一个线程的最后执行Looper.loop();后面说明handler定绑了前当线程的消息队列,loop()方法就是听监消息队列,并且执行作操,因此这个方法是一个无限循环,其以后的代码都不会执行,所以在线程的最后执行。
种这式模有点像大学作操系统中的生产者和消费者式模,looper就像消费者,handler就像生产者,比拟殊特的是在一个线程中消费者looper只能有一个,生产者handler可以有多个。接下来带着面上的知识看看looper中的要主代码:
每日一道理
无知者为梦想中的虚幻而苦苦等待,换回的不是所求的,而是岁月在脸上留下的印痕,一事无成的人一生便是虚度。生活中,与其花时间去等待,不如加快步伐去追寻理想,试着与时间赛跑,也许身躯、心理会感到劳累,但这样的生活毕竟是充实的。
public static void prepare() { prepare(true); } private static void prepare(boolean quitAllowed) { if (sThreadLocal.get() != null) { throw new RuntimeException("Only one Looper may be created per thread"); } sThreadLocal.set(new Looper(quitAllowed)); } public static void loop() { final Looper me = myLooper(); final MessageQueue queue = me.mQueue; for (;;) { Message msg = queue.next(); // might block ..... msg.target.dispatchMessage(msg); } }
在序程中如果某一个子方法面里及涉到了handler而前当线程没有定绑looper(比如在某个自己新建的线程中新分配的一个象对就可能要需handler),运行时就会抛出异常:
if (mLooper == null) { throw new RuntimeException( "Can't create handler inside thread that has not called Looper.prepare()"); }
而如果只在线程的扫尾执行Looper.prepare();而没有执行Looper.loop();就会现出很多作操不会执行的象现。:)
最后再总结下:用了久很的Handler.post(Runnable),始终没去深刻看下道理。android封装的太好了,及涉到新更UI的东东就面上说的已够用,如果有一些殊特的要需HandlerThread,AsyncTask都已帮我们封装好了。不过既然公开了源代码,还是去了解下实现道理比拟好。O(∩_∩)O~~
文章结束给大家分享下程序员的一些笑话语录:
一位程序员去海边游泳,由于水性不佳,游不回岸了,于是他挥着手臂,大声求.救:“F1,F1!”
相关文章推荐
- 线程执行android的looper,handler消息小结
- Android开发: 线程间消息通信 Looper 和Handler
- Android开发: 线程间消息通信 Looper 和Handler
- Android进程和线程 --消息队列模型 (Looper, MessageQueue, Handler) (1)
- 【Android开发】线程与消息处理-Handler消息传递机制之Looper
- Android:线程间通讯、Handler、Looper、IntentService、自定义消息队列
- Android异步消息处理线程之----Looper+MessageQueue+Handler
- android的looper,handler消息小结
- Android线程之异步消息处理机制(二)——Message、Handler、MessageQueue和Looper
- android的looper,handler消息小结
- Android应用程序消息处理机制(Looper、Handler)分析
- Android消息处理机制Handler、Looper、Message
- Android 异步消息处理机制 让你深入理解 Looper、Handler、Message三者关系
- Android 异步消息处理机制 让你深入理解 Looper、Handler、Message三者关系
- Android的线程使用来更新UI----Thread、Handler、Looper、TimerTask
- Android入门进阶教程(18)- Looper、MessageQueue、Handler 与消息循环
- android的消息处理机制(图+源码分析)——Looper,Handler,Message
- [置顶] [Android源代码分析]Android消息机制,Handler,Message,Looper,MessageQueue
- Android 异步消息处理机制 让你深入理解 Looper、Handler、Message三者关系
- Android 异步消息处理机制 让你深入理解 Looper、Handler、Message三者关系