Android应用开发实践教程 第9章 Android中的一些异步处理技术
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
02 9.2 IntentService
IntentService 是继承 Service 并处理异步请求的一个类,在 IntentService 内有一个工作线程来处理耗时操作,启动 IntentService 的方式和启动传统的 Service 一样。 而每一个耗时操作会以队列的方式在 IntentService 的 onHandlerIntent() 回调方法中执行。并且每一次只会执行一个工作线程, 执行完第一个再执行第二个(注意此优先级要比普通Service的优先级高)。
01 9.1 HandlerThread
HanlderThread 类的声明: public class HandlerThread extends Thread {...} HanlderThread 继承自 Thread,使用 HandlerThread 能够创建拥有 Looper 的线程。在 HandlerThread 的 run() 方法中,通过 Looper.prepare() 创建了消息队列,并通过 Looper.loop() 开启了消息循环。 使用时开启 HandlerThread,创建 Handler 与 HandlerThread 的 Looper 绑定,Handler 以消息的方式通知 HandlerThread 来执行一个具 体的任务。
第 9 章 Android 中的一些 异步处理技术
01 9.1 HandlerThread 02 9.2 IntentService 03 9.3 AsyncTask 04 9.4 本章小结
Βιβλιοθήκη Baidu 本章导读
本章介绍了 Android 中提供的一些异步处理技术,主要 包括 HandlerThread、IntentService、AsyncTask。 Android 应用的开发要求我们正确处理主线程与子线程 之间的关系,耗时操作应当放到子线程中,避免阻塞主 线程,导致ANR。异步处理技术是提高应用性能解决主 线程和子线程之间通信问题的关键。
02 9.2 IntentService
Service是一个不可见的Activity,它的几个方法 (onCreate\onStartCommand\onBind等)是运行在主线程中的,因此不 要在Service中做一些重量级(耗时长)的操作,否则可能会导致ANR。 实际上,广播接收器 BroadcastReceiver的onReceive() 方法也是运行在主 线程中的,也不能执行耗时长的操作(在面试中经常会被问到)。
01 9.1 HandlerThread
【示例】使用 HandlerThread 异步加载网络图片
01 9.1 HandlerThread
在 Ch9\HandlerThreadDemo2(示例)中,创建了两个 Handler, 一个用于更新 UI 线程的 mUIHandler 和一个用于异步下载图片的 childHandler。childHandler 会每隔3秒,通过 sendEmptyMessageDelayed() 方法,通知 ChildCallback 的回调函数 handleMessage() 去下载网络图片(这里 ChildCallback 是实现 Handler.Callback 接口的),图片下载成功便告知主线程的 mUIHandler 更新UI界面。
02 9.2 IntentService
IntentService 是一个基础类,用于处理 Intent 类型的异步任务请求。 当客户端调用 android.content.Context#startService(Intent) 发送请求 时,Service 服务被启动,且在其内部构建一个工作线程来处理 Intent 请 求。当工作线程执行结束,Service 服务会自动停止。 IntentService 是一个抽象类,用户必须实现一个子类去继承它,且必须 实现 IntentService 里面的抽象方法 onHandleIntent() 来处理异步任务 请求。
01 9.1 HandlerThread
【示例】使用 HandlerThread 获取随机数。 mSubThreadHandler 是子线 程中的 Handler 实例; mUiHandler 是与 UI 线程绑定 的 Handler 实例。
01 9.1 HandlerThread
点击“获取随机数”按钮,向 mSubThreadHandler 发送消息, mSubThreadHandler 中接收到消息进行处理,由 Logcat可知 mSubThreadHandler 的handleMessage() 方法运行在子线程 (HandlerThread 线程)中。在 mSubThreadHandler 的 handleMessage() 方法中模拟耗时操作,生成随机数,然后向主线程(UI 线程)中的 mUiHandler 发送消息(Message)。 mUiHandler 的 handleMessage() 方法运行在主线程,可以用来更新 UI 界面。当 Activity 销毁的时候,回调 onDestroy() 方法,于是调用 mHandlerThread.quit(),退出 HandlerThread 的 Looper 循环。
本章导读
本章主要内容有: (1)HandlerThread 的使用及源码分析; (2)IntentService 的使用及源码分析; (3)AsyncTask 的使用及工作原理。
01 9.1 HandlerThread
Android 官方文档是这么介绍 HandlerThread 类的: “Handy class for starting a new thread that has a looper. The looper can then be used to create handler classes. Note that start() must still be called.” 意即:HandlerThread 是Android API 提供的一个方便、便捷的类,使用 它我们可以快速的创建一个带有 Looper 的线程。Looper 可以用来创建 Handler实例。注意:start()仍然必须被调用。