关于Android中的消息机制和异步
来源:互联网 发布:数据库设计有哪些步骤 编辑:程序博客网 时间:2024/06/01 09:12
转载地址:http://blog.csdn.net/zhangjg_blog/article/details/12949785
Android中的异步
android中的应用开发,不像是写控制台程序,他是一种和UI相关的程序。几乎所有的UI应用程序都会有这样的要求:不能在主线程(即UI线程)中做耗时的操作。因为一般情况下,主线程负责处理消息和更新界面。其实更新界面也是基于消息驱动的。
在android设备上, 我们做的每个操作,比如按下菜单键或返回键,或者点击了界面上的一个按钮,这些事件 都会被封装成一个消息,发送到主线程的消息队列中。而主线程监听在他的消息队列上, 如果消息队列中进入了一个消息,那么主线程便取出这个消息,调用这个消息上的回调方法,如果主线程的消息队列中没有消息,那么主线程便会阻塞在队列上,直到一个消息的到来。这种消息机制可以用下面的一张图来解释(该图片来自百度):
从这张图中可以看到android消息机制的几个角色:
- MessageQueue:消息队列。和线程绑定,用于存储当前线程的消息
- Looper:循环器。和线程绑定,用于控制消息循环。例如在消息队列为空时阻塞当前线程。
- Message:消息实体。
- Handler:句柄。和线程绑定,用于发送消息,并且负责消息的回调处理。
其实主线程中的所有代码都是由这种消息机制驱动的。比如我们熟悉的onCreate等回调方法,是框架向该应用程序的主线程的消息队列中发送了一个消息,然后由主线程基于这个消息,调用onrCreate等回调方法。
如果在主线程中做耗时的操作,比如IO和网络,那么主线程就会被长时间的占用,他的消息队列中还有其他消息就不能被即使处理,导致应用程序崩溃,这就是著名的ANR(application no response)错误。举个例子,主线程正在从数据库中读取大量的数据,这时你点击了界面上的一个按钮,这个事件被封装成消息发送到主线程的消息队列,等待主线程处理,由于主线程正在读数据,所以这个消息得不到及时的处理。
所以,在安卓应用开发中, 为了避免主线程被阻塞,将耗时的操作放到子线程中是非常重要的。最主要的处理方式是:
- 主线程创建一个Handler对象,这个Handler对象在创建完成后就和主线程绑定在一起,他将消息发送到主线程的消息队列中,并且负责这个消息的处理。
- 将耗时的操作放到一个新开的子线程中执行,并且传入主线程的Handler,在子线程执行完毕时,使用这个Handler发送一个消息到主线程的消息队列
- 主线程的Looper(主线程创建时建立)控制主线程读取到这个消息
- 主线程执行这个消息上的回调方法(一般情况下会回调Handler中的handleMessage方法)
较新的android版本中, 还引入了一些用于异步加载的API,这个异步加载的工具其实底层都是利用的Android的消息机制。
异步 or 同步
- 首先创建线程池ExecutorService
- 调用ExecutorService的submit方法,传入一个任务对象Callable,返回一个结果Future
- 在当前线程中调用Future对象的get方法, 等待后台任务执行完成返回结果
这样的话, 可以直接在主线程中调用userLoginCheckWaited方法, 而不用再写异步相关的代码, 可以使代码大大简化。调用代码如下:
- 关于Android中的消息机制和异步
- 关于Android中的消息机制和异步
- 关于 Android 异步消息处理机制 Handler
- android中的异步消息处理机制
- Android中的消息机制与异步任务
- Android中的异步消息处理机制Hander
- android消息机制,异步和多线程
- android消息机制,异步和多线程
- android消息机制,异步和多线程
- [转]android消息机制,异步和多线程
- android消息机制,异步和多线程
- Android异步消息机制
- Android 异步消息机制
- Android异步消息机制
- 关于Android中的Handler消息机制
- Andriod 中的异步消息机制
- 关于android异步消息机制的描述图
- Android中的异步消息
- 自定义java事件监听
- C++STL介绍
- Java常用类库--对象克隆技术clone
- ios实现用户登录的保存密码功能
- 请求码和结果码
- 关于Android中的消息机制和异步
- 数的长度
- 斯坦福大学公开课:编程方法学——Karel作业的第四题
- 谈谈SQL 语句的优化技术 (1)
- Linux与VxWorks主要区别(五):请求内核服务方式
- WFS的代理设置(Apache)
- VS2008打开资源文件时显示说没有安装这个ActiveX控件 "{648A5600-2C6E-101B-82B6-000000000014
- Boost.Bind和Boost.Function的一种搭配使用法
- vc2010编译opencv2.4.6 【1】