设为首页 加入收藏

TOP

Android中Handler的线程间通讯原理
2014-11-24 11:17:51 来源: 作者: 【 】 浏览:0
Tags:Android Handler 线程 通讯 原理

其实说白了就是要把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知识这里只做了解。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Android编程 - 列表控件使用 下一篇解决Android Listview横向滑动

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·Redis on AWS:Elast (2025-12-27 04:19:30)
·在 Spring Boot 项目 (2025-12-27 04:19:27)
·使用华为开发者空间 (2025-12-27 04:19:24)
·Getting Started wit (2025-12-27 03:49:24)
·Ubuntu 上最好用的中 (2025-12-27 03:49:20)