Android中Handler的线程间通讯原理
2012-02-17 11:02
239 查看
就是要把Handle对象传递的东西放在一个消息循环的队列当中,如果没有这个消息循环队列的话,就会报错!
在做比较简单线程通讯的时候,我们只是在主Activity线程中使用Handler.sendMessage(Message)方法来实现消息的发送,用Handler.handleMessage(Message)类实现消息的获取,这似乎没有什么错误,而且如果在我们自己开启的普通线程中向主Activity线程发送消息似乎也不会有什么错误,可以捕获我们想要的消息。
但是如果我们接收消息的线程不在主线程那么而是一个普通线程,那么就会报错。为什么会这样呢?原因就是因为在我们自定义的普通线程中没有消息循环队列。那么怎么来实现一个消息循环队列呢?(假设我们都复写了handleMessage(Message)方法)
1.这是最简单的方法,是在实例化Handler对象的时候传入调用HandlerThread.getLooper()获得的Looper对象,这个Looper就是我们需要的消息循环队列。当然这个HandlerThread对象必须调用start()方法去让他开启的线程运行。
2.这个方法是模仿HandlerThread类的run()方法写出来的。就是在定义Handler对象的前加上Looper.prepare()方法,让消息循环开始准备,在定义完以后在调用Looper.loop();然消息循环开始运行。其实这两个方法本质上是没有没有区别的,都是给一个普通线程添加了一个消息队列。
那么为什么在Activity中就没有什么问题呢?
原因是Activity其实什么也不是,只是一个大怪物,他把很多功能都整合到了一起,并且把他封装起来,当然也包括一个消息循环队列(这个消息循环队列由系统来维护),所以在简单的主Activity中用Handler传递消息不会报错。有人说Activity是界面其实并不是这样的,我们看到的只不过是一个Window或者View,他用Window的功能监听事件,用View的功能显示界面,还有集成了数据存储等功能,等等。在此只讲Handler,过多的Activity知识这里只做了解。
原文件出自http://www.linuxidc.com/Linux/2011-09/42129.htm
在做比较简单线程通讯的时候,我们只是在主Activity线程中使用Handler.sendMessage(Message)方法来实现消息的发送,用Handler.handleMessage(Message)类实现消息的获取,这似乎没有什么错误,而且如果在我们自己开启的普通线程中向主Activity线程发送消息似乎也不会有什么错误,可以捕获我们想要的消息。
但是如果我们接收消息的线程不在主线程那么而是一个普通线程,那么就会报错。为什么会这样呢?原因就是因为在我们自定义的普通线程中没有消息循环队列。那么怎么来实现一个消息循环队列呢?(假设我们都复写了handleMessage(Message)方法)
1.这是最简单的方法,是在实例化Handler对象的时候传入调用HandlerThread.getLooper()获得的Looper对象,这个Looper就是我们需要的消息循环队列。当然这个HandlerThread对象必须调用start()方法去让他开启的线程运行。
2.这个方法是模仿HandlerThread类的run()方法写出来的。就是在定义Handler对象的前加上Looper.prepare()方法,让消息循环开始准备,在定义完以后在调用Looper.loop();然消息循环开始运行。其实这两个方法本质上是没有没有区别的,都是给一个普通线程添加了一个消息队列。
那么为什么在Activity中就没有什么问题呢?
原因是Activity其实什么也不是,只是一个大怪物,他把很多功能都整合到了一起,并且把他封装起来,当然也包括一个消息循环队列(这个消息循环队列由系统来维护),所以在简单的主Activity中用Handler传递消息不会报错。有人说Activity是界面其实并不是这样的,我们看到的只不过是一个Window或者View,他用Window的功能监听事件,用View的功能显示界面,还有集成了数据存储等功能,等等。在此只讲Handler,过多的Activity知识这里只做了解。
原文件出自http://www.linuxidc.com/Linux/2011-09/42129.htm
相关文章推荐
- 深入Android Handler源码,分析主线程、子线程通讯原理
- Android中Handler的线程间通讯原理
- android handler线程原理详解
- 【Android开发】线程间通讯机制(基础篇)——Handler、Runnable、HandlerThread、AsyncTask的使用
- android handler线程原理详解
- Android中线程间通信原理分析:Looper,MessageQueue,Handler
- Android 主线程handler 和子线程handler的通讯实例,图灵机器人(本地模拟回复,暂时没有网络请求)
- Android Handler 机制以及各方法所在线程原理分析
- Android-线程通讯设计模式-Handler消息模型
- Android中线程间通信原理分析:Looper,MessageQueue,Handler
- 【Android开发】线程间通讯机制(提高篇)——深入浅出实现原理
- Android:线程间通讯、Handler、Looper、IntentService、自定义消息队列
- 【Android开发】线程间通讯机制(基础篇)——Handler、Runnable、HandlerThread、AsyncTask的使用
- android handler线程原理详详解
- Android 从源码出发深度理解Handler线程通讯机制(这一篇就够了)
- Android线程通信:Handler,MessageQueue和Looper原理分析
- android handler线程原理详详解
- Android:ANR、线程间通讯、Handler、Message
- android handler线程原理详详解
- Android:线程间通讯的其他方法、runOnUiThread(action)、Handler.post(action)、post