文章目录

  • 一、AsyncTask 参数简介
  • 二、AsyncTask 方法简介
  • 三、AsyncTask 基本用法
  • 四、AsyncTask 构造函数源码解析
  • 五、AsyncTask 构造函数相关源码注释





一、AsyncTask 参数简介



AsyncTask 泛型类型 :

  • 异步任务开始时 , execute() 方法传入的参数类型 , 也是 doInBackground() 方法传入的参数类型 ;
  • 异步任务执行时 , 进度值类型 , onProgressUpdate() 方法传入的参数类型 ;
  • 异步任务结束时 , 结果类型 , onPostExecute() 方法传入参数类型 , 或 onCancelled() 方法参数 ;




二、AsyncTask 方法简介



AsyncTask 常用方法解析 :

  • doInBackground() : 核心方法 , 执行异步任务 , 该方法在 子线程 中执行 ;
  • onPreExecute() :doInBackground() 执行前先执行的方法 , 主线程 中执行 , 可更新 UI 界面 ;
  • onProgressUpdate() : 调用 publishProgress() 回调的方法 , 主线程 中执行 , 可更新 UI 界面 ;
  • onPostExecute() : doInBackground() 执行完毕后再执行的方法 , 主线程 中执行 , 可更新 UI 界面 ;




三、AsyncTask 基本用法



AsyncTask 使用注意点 :

  • UI 线程创建
  • UI 线程调用执行 execute()
  • 创建后只能执行一次

自定义 AsyncTask 异步任务 :

package kim.hsl.aa;import android.os.AsyncTask;/** * AsyncTask 泛型解析 * - 1. 异步任务开始时 , execute 方法传入的参数类型 * - 2. 异步任务执行时 , 进度值类型 * - 3. 异步任务结束时 , 结果类型 */public class MyAsyncTask extends AsyncTask<String, Integer, Boolean> {    @Override    protected void onPreExecute() {        // doInBackground 之前执行的方法, 一般在该方法中执行初始化操作 ( 主线程, 可以更新 UI )        super.onPreExecute();    }    @Override    protected Boolean doInBackground(String... strings) {        // 主要的耗时操作是在该方法中执行的 ( 非主线程, 不能更新 UI )        return null;    }    @Override    protected void onProgressUpdate(Integer... values) {        // 在 doInBackground 中调用了 publishProgress 方法, 就会回调该方法        // 一般情况下是在该方法中执行更新 UI 的操作 ( 主线程, 可以更新 UI )        super.onProgressUpdate(values);    }    @Override    protected void onPostExecute(Boolean aBoolean) {        // doInBackground 执行完毕后 , 调用 return 方法后 , 该方法会被调用 ( 主线程, 可以更新 UI )        super.onPostExecute(aBoolean);    }    @Override    protected void onCancelled() {        super.onCancelled();    }    @Override    protected void onCancelled(Boolean aBoolean) {        super.onCancelled(aBoolean);    }}

调用异步任务 :

public class MainActivity extends AppCompatActivity {    private MyAsyncTask mMyAsyncTask;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        // 创建并执行异步任务        mMyAsyncTask = new MyAsyncTask();        mMyAsyncTask.execute();    }}




四、AsyncTask 构造函数源码解析



AsyncTask 构造函数作用 : 创建一个新的异步任务 , 该构造函数必须在 UI 主线程调用 ;


构造函数中做了三件事 :

  • 获取 Handler : 该 Handler 是主线程的 Handler ;
  • 创建 WorkerRunnable : WorkerRunnable 是实现了 Callable 接口的抽象类 , 该接口中只定义了一个 call() 函数 ;
  • 创建 FutureTask : FutureTask 是实现了 RunnableFuture 接口的类 , 该接口中定义了一个 run() 方法 ;


Callable 接口简介 : Callable 接口实现类定义一个没有参数的 call 方法 , 该接口与 Runnable 类似 , 两个接口中都被设计为 , 实现类对象的方法可能被另外一个线程执行


Runnable 与 Callable 接口对比 :

  • Runnable 不能返回结果 , 不能抛出检查过的异常
  • Callable 是一个任务 , 返回一个结果 , 并抛出异常 ;

WorkerRunnable 泛型 :

  • Params 是参数类型 , 也是 AsyncTask 的 doInBackground() 方法的输入参数类型
  • Result 是返回值类型 , 也是 AsyncTask 的 doInBackground() 方法的执行完毕的返回值类型


RunnableFuture 接口简介 : 该接口继承 Runnable 接口 , Future 接口 ;

  • 在普通的 Thread 方法中 , 调用线程的 start() 方法 , 会执行 Thread 对象中的 run() 方法 , 但是方法执行的结果我们是不知道的 ;

  • 而在 AsyncTask 异步任务中 , 执行 doInBackground() 方法 , 该方法也是在子线程中执行的 , 可以得到该方法执行的结果 , 这个执行结果是靠 Future 接口得到的 ;



在 WorkerRunnable 中的 call() 方法中执行了 doInBackground() 方法 ;

在 FutureTask 中的 done() 方法中 :

  • 执行 postResultIfNotInvoked 方法 : 如果没有被调用 , 那么传递结果 ;
    • 执行 postResult() 方法 : 在该方法中使用主线程 Handler 发送 MESSAGE_POST_RESULT 消息 , 触发 AsyncTask 异步任务的 onPostExecute() 方法




五、AsyncTask 构造函数相关源码注释



public abstract class AsyncTask<Params, Progress, Result> {// ...    /**     * 创建一个新的异步任务 . 该构造函数必须在 UI 主线程调用 .      * @hide 隐藏方法     */    public AsyncTask(@Nullable Looper callbackLooper) {    // 获取 Handler , 用于线程间通信      // 获取主线程 Looper 对应的 Handler , 或者创建主线程对应 Handler         mHandler = callbackLooper == null || callbackLooper == Looper.getMainLooper()            ? getMainHandler()            : new Handler(callbackLooper);// 创建工作任务 , 该类是 Callable 接口的子类// 实际的 doInBackground() 耗时任务 , 是在该任务中执行的         mWorker = new WorkerRunnable<Params, Result>() {            public Result call() throws Exception {                mTaskInvoked.set(true);                Result result = null;                try {                    Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);                    // 正式执行 doInBackground() 耗时任务 , 在子线程中执行                     result = doInBackground(mParams);                    Binder.flushPendingCommands();                } catch (Throwable tr) {                    mCancelled.set(true);                    throw tr;                } finally {                    postResult(result);                }                return result;            }        };// 未来的任务         mFuture = new FutureTask<Result>(mWorker) {            @Override            protected void done() {                try {                // 最终会调用该方法                     postResultIfNotInvoked(get());                } catch (InterruptedException e) {                    android.util.Log.w(LOG_TAG, e);                } catch (ExecutionException e) {                    throw new RuntimeException("An error occurred while executing doInBackground()",                            e.getCause());                } catch (CancellationException e) {                    postResultIfNotInvoked(null);                }            }        };    }// 如果没有被调用 , 那么传递结果     private void postResultIfNotInvoked(Result result) {        final boolean wasTaskInvoked = mTaskInvoked.get();        if (!wasTaskInvoked) {        // 传递结果             postResult(result);        }    }// 传递结果 , 发送 MESSAGE_POST_RESULT 消息 , 该消息会实际上触发 异步任务 AsyncTask 的 onPostExecute() 方法    private Result postResult(Result result) {        @SuppressWarnings("unchecked")        Message message = getHandler().obtainMessage(MESSAGE_POST_RESULT,                new AsyncTaskResult<Result>(this, result));        message.sendToTarget();        return result;    }        // ... /** * WorkerRunnable 实现 Callable 接口 * Callable 是一个任务 , 返回一个结果 , 并抛出异常 * 实现类定义一个没有参数的 call 方法  * 该接口与 Runnable 类似 , 两个接口中都被设计为 : 实现类对象的方法可能被另外一个线程执行 * Runnable 不能返回结果 , 不能抛出检查过的异常  *  * Params 是参数类型 , 也是 AsyncTask 的 doInBackground() 方法的输入参数类型 * Result 是返回值类型 , 也是 AsyncTask 的 doInBackground() 方法的执行完毕的返回值类型  */    private static abstract class WorkerRunnable<Params, Result> implements Callable<Result> {        Params[] mParams;    }// ... }

更多相关文章

  1. android语音识别方法示例代码
  2. Android下java方法和JS方法的互调
  3. Android 中LayoutInflater(布局加载器)源码篇之parseInclude方法
  4. Android 中LayoutInflater(布局加载器)源码篇之rInflate方法
  5. Android解析Intent Filter的方法
  6. android中访问本机服务器的方法

随机推荐

  1. 图解Android和Linux发行版的区别
  2. 一行命令从 APK 文件中提取 Endpoint 及
  3. Qt for Android使用grpc探索
  4. android. MVC三层分层
  5. android ListView 设定背景图后拖动时整
  6. Android amr语音编解码解惑
  7. Android历史版本与API Level对应关系对照
  8. 微信Android模块化架构重构实践
  9. Android gitHub 开源
  10. Android移植成功:linux-2.6.25.8+U盘挂载