你的位置:首页 > 软件开发 > 操作系统 > Android AsyncTask 深度理解、简单封装、任务队列分析、自定义线程池

Android AsyncTask 深度理解、简单封装、任务队列分析、自定义线程池

发布时间:2016-08-10 15:00:03
前言:由于最近在做SDK的功能,需要设计线程池。看了很多资料不知道从何开始着手,突然发现了AsyncTask有对线程池的封装,so,就拿它开刀,本文将从AsyncTask的基本用法,到简单的封装,再到任务队列分析,最后自定义线程池。 1、概念 Android 中 ...

Android AsyncTask 深度理解、简单封装、任务队列分析、自定义线程池

前言:由于最近在做SDK的功能,需要设计线程池。看了很多资料不知道从何开始着手,突然发现了AsyncTask有对线程池的封装,so,就拿它开刀,本文将从AsyncTask的基本用法,到简单的封装,再到任务队列分析,最后自定义线程池。

 

1、概念

    Android 中的异步任务常用的一种方式是:Handler + Thread 组合来实现的。Thread 负责子线程的耗时操作,Handler 负责线程间的通信,用的最多的当属子线程和主线程通信。

    Android 为了简化操作,提供了 AsyncTask 类来实现异步任务,并且轻松实现子线程和主线程间的通信。

2、AsyncTask的简单封装

    三个参数代表的含义

  • Params:第一个参数是启动任务传进来的参数;
  • Progress:第二个参数是用来显示进度条的参数;
  • Result:第三个参数是后台执行后返回的参数的类型。
package com.app;import android.os.AsyncTask;/** * Created by ${zyj} on 2016/8/2. */public class MyTask<T> extends AsyncTask<T , Integer , T> {  private TaskListener taskListener ;  public MyTask(){  }  //执行预处理,它运行于UI线程,可以为后台任务做一些准备工作,比如绘制一个进度条控件。  @Override  protected void onPreExecute() {    if ( taskListener != null ){      taskListener.start();    }  }  //运行于UI线程,可以对后台任务的结果做出处理,结果就是doInBackground(Params...)的返回值。  @Override  protected void onPostExecute(T t) {    if ( taskListener != null ){      taskListener.result( t );    }  }  /**   * 更新子线程进度,运行于UI线程   * @param values   */  @Override  protected void onProgressUpdate(Integer... values) {;    if ( taskListener != null ){      taskListener.update( values[0] );    }  }  //运行与后台线程  @Override  protected T doInBackground(T... ts) {    if ( taskListener != null ){      return (T) taskListener.doInBackground( ts[0] ) ;    }    return null;  }  public MyTask setTaskListener(TaskListener taskListener ){    this.taskListener = taskListener ;    return this ;  }  /**   * 更新进度   * @param progress   */  public void updateProgress( int progress ){    publishProgress( progress );  }  public interface TaskListener<T>{    void start() ;    void update( int progress ) ;    T doInBackground( T t );    void result( T t );  }  /**   * 取消一个正在执行的任务   */  public void cancle(){    if ( !isCancelled() ){      cancel( true ) ;    }  }}

7、AsyncTask 串行处理任务 和 并行处理任务

     在上面的代码演示中,执行任务用的都是 myTask.execute() , 这个默认是串行执行任务的。比如同一时刻有两个任务要处理,AsyncTask 会先执行第一个任务,等第一个任务执行结束,然后才会执行第二个任务。

     在AsyncTask中还有一个并行处理任务的方法:executeOnExecutor( Executor exe , Params... params ) 。 

 

     下面是串行执行任务execute()的源码

     Android AsyncTask 深度理解、简单封装、任务队列分析、自定义线程池

 

  通过看源码,发现其实串行执行任务也是调用了并行的方法 executeOnExecutor () , 只不过启用了一个默认的 sDefaultExecutor (sDefaultExecutor 是一个串行的线程池)。

  有串行线程池,那么势必就有一个并行线程池 , 在AsyncTask里面源码里面定义了一个并行线程池: THREAD_POOL_EXECUTOR 。

  Android AsyncTask 深度理解、简单封装、任务队列分析、自定义线程池

       可以看到并行 THREAD_POOL_EXECUTOR 是通过 new ThreadPoolExecutor() 来创建的

  public ThreadPoolExecutor(int corePoolSize,               int maximumPoolSize,               long keepAliveTime,               TimeUnit unit,               BlockingQueue<Runnable> workQueue,               ThreadFactory threadFactory) {    this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,       threadFactory, defaultHandler);  }
一个任务通过 execute(Runnable)方法被添加到线程池,任务就是一个 Runnable类型的对象,任务的执行方法就是 Runnable类型对象的run()方法。

原标题:Android AsyncTask 深度理解、简单封装、任务队列分析、自定义线程池

关键词:Android

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

可能感兴趣文章

我的浏览记录