前言
提到Android的多线程机制,常用的有如下几种方式:
- AsyncTask: 封装了线程池和Handler,为 UI 线程与工作线程之间进行快速切换提供一种便捷机制。适用于当下立即需要启动,但是异步执行的生命周期短暂的使用场景。
- HandlerThread: 一个已经拥有了Looper的线程类,内部可以直接使用Handler。为某些回调方法或者等待某些任务的执行设置一个专属的线程,并提供线程任务的调度机制。
- ThreadPool: 把任务分解成不同的单元,分发到各个不同的线程上,进行同时并发处理。
- IntentService: 适合于执行由 UI 触发的后台 Service 任务,并可以把后台任务执行的情况通过一定的机制反馈给 UI。
尽管Android已经设计了基本的Handler异步消息机制提供给我们进行线程间通信,不过对于频繁得UI更新操作Handler用起来确实有点细碎,为了更加方便我们在子线程中更新UI元素,Android从1.5版本就引入了一个AsyncTask类,使用它我们可以非常灵活方便地从子线程切换到UI线程。
我们就从AsyncTask的基本用法开始,一起分析下AsyncTask源码,看看它是如何实现的。
使用AsyncTask
由于AsyncTask是一个抽象类,所以如果我们想使用它,就必须要创建一个子类去继承它。在继承时我们可以为AsyncTask类指定三个泛型参数,这三个参数的用途如下:
- Params:在执行AsyncTask时需要传入的参数,可用于在后台任务中使用。
- Progress:后台任务执行时,如果需要在界面上显示当前的进度,则使用这里指定的泛型作为进度单位。
- Result:当任务执行完毕后,如果需要对结果进行返回,则使用这里指定的泛型作为返回值类型。
一个最简单的自定义AsyncTask就可以写成如下方式:
1 | private class MyTask extends AsyncTask<Void, Void, Void> { ... } |