AsyncTask、HandlerThread、IntentService和线程池

时间:2017-09-18 09:23:07   收藏:0   阅读:341

AsyncTask

  AsyncTask 是一种轻量级的异步任务类,可以在线程池中执行后台任务,然后把执行的进度和最终结果传递给主线程用于更新UI。

可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI主线程.

  AsyncTask 并不合适进行特别耗时的后台任务,对于特别耗时的任务来说,建议使用线程池。

 

AsyncTask 和 Handler对比:

1 )  Async使用的优点:

  l  简单,快捷

  II 过程可控      

使用的缺点:

  l  在使用多个异步操作和并需要进行Ui变更时,就变得复杂起来.

2 )Handler异步实现的原理和适用的优缺点

  在Handler 异步实现时,涉及到 Handler, Looper, Message,Thread四个对象,实现异步的流程是主线程启动Thread(子线程)àthread(子线程)

运行并生成Message-àLooper获取Message并传递给HandleràHandler逐个获取Looper中的Message,并进行UI变更。

  使用的优点:

  l  结构清晰,功能定义明确

  lI  对于多个后台任务时,简单,清晰

   

使用的缺点:

  l  在单个后台异步处理时,显得代码过多,结构过于复杂(相对性)

 

Android 的AsyncTask比Handler更轻量级一些,适用于简单的异步处理。

AsyncTask定义了三种泛型类型 Params,Progress和Result。

  • Params 启动任务执行的输入参数,比如HTTP请求的URL。
  • Progress 后台任务执行的百分比。
  • Result 后台执行任务最终返回的结果,比如String。

使用过AsyncTask 的同学都知道一个异步加载数据最少要重写以下这两个方法:

有必要的话你还得重写以下这三个方法,但不是必须的:

使用AsyncTask类,以下是几条必须遵守的准则:

 

HandlerThread

  HandlerThread 其实是一种Thread,它是可以使用Handler的THread,它的实现其实很简单就是在run方法中通过Looper.prepare()来创建消息队列,并通过Looper.loop来开启消息循环,这样在实际的使用

中就允许在HandlerThread中创建Handler了。

技术分享
private void init4(){
        //创建一个线程,线程名字:handler-thread
        myHandlerThread = new HandlerThread( "handler-thread") ;
        //开启一个线程
        myHandlerThread.start();
        //在这个线程中创建一个handler对象
        Log.d(TAG, "init4: "+Thread.currentThread().getId());
        handler3 = new Handler( myHandlerThread.getLooper() ){
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                //这个方法是运行在 handler-thread 线程中的 ,可以执行耗时操作
                Log.d(TAG , "消息: " + msg.what + "  线程: " + Thread.currentThread().getId()  ) ;
            }
        };

        //在主线程给handler发送消息
        handler3.sendEmptyMessage( 1 ) ;

        new Thread(new Runnable() {
            @Override
            public void run() {
                Log.d(TAG, "new runnable "+Thread.currentThread().getId());
                //在子线程给handler发送数据
                handler3.sendEmptyMessage( 2 ) ;
            }
        }).start() ;
    }
View Code

技术分享

使主界面更流畅。  它有自己的MessageQueue不会干涉主线程中的消息队列。

 

线程池:

 

原文:http://www.cnblogs.com/NeilZhang/p/7450185.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!