Android多线程(二)——AsyncTask、HandlerThread、IntentService的使用与对比

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是服务,这导致它的优先级比普通的工作线程高很多,不容易被后台杀死。

用法

  1. 复写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()
   }
}
  1. 在manifest中注册service。
  2. 在主线程中启动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的。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值