AsyncTask
简介
定义
AsyncTask翻译过来的意思就是异步任务,他可以实现在线程池中执行耗时任务,并可以把任务执行的进度与结果传递给主线程。常见用于处理下载任务,尤其是多个下载任务,没有什么比AsyncTask更合适的了。但是AsyncTask只适用于短时间(a few seconds at the most)执行的多异步任务,对于特别耗时的建议使用Executor、ThreadPoolExecutor、FutureTask。
用法
我这里是使用内部类的,这样比较方便与UI交互,但是复用性较差。若想提高复用性,那么可以去写一个普通类,供多个场景调用记得处理好与UI交互问题。
/*定义MyAsyncTask内部类继承自AsyncTask
给Params, Progress, Result三个参数指定具体类型
params:execute(params)方法执行时传入,传到doInBackground()中去
progress:publishProgress(progress)传入,最终传到onProgressUpdate中
result:doInBackground的返回结果,执行完毕到onPostExecute,取消执行到onCancelled中
*/
inner class MyAsyncTask : AsyncTask<Int,Int,Int>(){
//1.可选,异步操作执行前的准备操作
override fun onPreExecute() {
super.onPreExecute()
}
//2.必须重写,这里定义在工作线程执行的异步任务
override fun doInBackground(vararg params: Int?): Int {
for (index in 1..100){
publishProgress(index)
}
return 0
}
//4.可选,异步任务执行过程中的操作,含执行过程中的value
override fun onProgressUpdate(vararg values: Int?) {
super.onProgressUpdate(*values)
}
//5.可选,异步任务执行结束的操作,含result参数
override fun onPostExecute(result: Int?) {
super.onPostExecute(result)
}
//6.可选,异步任务取消的操作,含result参数
override fun onCancelled(result: Int?) {
super.onCancelled(result)
}
//7.可选,异步人物取消操作,无参
override fun onCancelled() {
super.onCancelled()
}
然后在主线程里new task对象,并执行myAsyncTask.execute()。异步任务就开始执行。
var myAsyncTask = MyAsyncTask()
//开始执行异步任务
myAsyncTask.execute()
HandlerThread
简介
HandlerThread是一种特别Thread,是由handler与Thread实现的。我们可以灵活的使用start和quit控制控制这个线程的开启与结束。工作线程需要处理来自其他线程的消息,那么这个工作线程可用handlerThread实现。
用法
实例化HanderThread,hander并且绑定对应的looper,在handler的handlerMesage中处理处理消息。其他线程通过handerThread的hander发消息给他。
//1. 实例化handlerThread
var handlerThread =HandlerThread("MainHandler")
//2.让线程启动
handlerThread.start()
//3. 实例化handler,这个handler是handlerThread的handler,不是主线程的,所以这里不准更新ui
var handler = Handler(handlerThread.looper){
//实现handleMessage接口
if(it.what==1){
//对应的事件处理
true
}
false
}
//4. 定义message,这里是主线程向handlerThread线程发消息
var msg = Message.obtain()
msg.what=1
handler.sendMessage(msg)
//5. handlerThread线程退出
handlerThread.quit()
IntentService
简介
IntentService是一种特殊Service,它是一个封装了Handler 和HanderThread的抽象类。它与其它普通的service不一样它可以在onHandleIntent()里面直接处理耗时任务,而普通的service则需要在子线程中去处理。我们在主线程中通过Intent传递信息多次启动intentService,让其在onHandleIntent根据intent信息去处理异步任务。因为IntentService是服务,这导致它的优先级比普通的工作线程高很多,不容易被后台杀死。
用法
- 复写myIntentService继承IntentService,并重写onHandleIntent方法。
class MyIntentService : IntentService("MyIntentService") {
//事物处理
override fun onHandleIntent(intent: Intent?) {
var name = intent?.extras?.getString("name")
Log.d("MyIntentService",":do"+name)
}
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
Log.d("MyIntentService",":onStartCommand")
return super.onStartCommand(intent, flags, startId)
}
override fun onCreate() {
Log.d("MyIntentService",":onCreate")
super.onCreate()
}
override fun onStart(intent: Intent?, startId: Int) {
Log.d("MyIntentService",":onStart")
super.onStart(intent, startId)
}
override fun onDestroy() {
Log.d("MyIntentService",":onDestroy")
super.onDestroy()
}
}
- 在manifest中注册service。
- 在主线程中启动service。这里的intent就是通信机制的实现,主线程向service中传递消息。通过观察打印信息可知在所有异步任务执行结束后service会执行destory。
val i = Intent(this, MyIntentService::class.java)
val bundle = Bundle()
bundle.putString("name", "task1")
i.putExtras(bundle)
startService(i)
stopService(i)
startService(i)
对比
AsyncTask和IntentService 相对于 HandlerThread比较常见,他们本质的异步实现还是基于Thread通信基于handler,不过IntentService通信是基于Intent的。