AsyncTask(异步任务)分析之基本使用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/l540675759/article/details/62264615

本文出自博客Vander丶CSDN博客,如需转载请标明出处,尊重原创谢谢

博客地址:http://blog.csdn.net/l540675759/article/details/62264615


AsyncTask是什么?

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

从实现上来说,AsyncTask封装了Thread和Handler,通过AsyncTask可以更加方便地执行后台任务以及在主线程中访问UI.但是AsyncTask并不适合进行特别耗时的后台任务.对于特别耗时的任务来说,建议使用线程池.

AsyncTask怎么用?

AsyncTask的参数介绍

AsyncTask是一个抽象的泛型类,它提供了Params、Progress、Result这个三个泛型参数。

public abstract class AsyncTask<Params, Progress, Result> {}

AsyncTask的泛型参数


AsyncTask的主要方法介绍

onPreExecute()
在主线程中执行,在异步任务执行之前会被调用,用来做一些准备工作。

doInBackgroud(Params...params)
在子线程中执行,此方法用来执行异步任务,Params表示异步任务的输入参数。
注意,在此方法中可以通过publishProgress方法来更新任务的进度,publishProgress方法会调用onProgressUpdate方法。
另外此方法需要返回计算结果给onPostExecute()方法,如果Result参数为Void的情况下,可以返回null。

onProgressUpdate(Progress...values)
在主线程中执行,当后台任务的执行进度发生改变的时,此方法会被调用。

onPostExecute(Result result)
在主线程中执行,在异步任务执行完毕后,此方法会被调用,其Result参数是后台任务的返回值,即doInBackground的返回值。

上述四个方法是AsyncTask的核心方法,当AsyncTask被取消的时候,onCancelled()方法会被调用,这个时候onPostExecute()方法不会被调用.

AsyncTask的基本执行流程

AsyncTask的Demo测试

TestAsyncTask.java

package com.commonproject.aysnctask;

import android.os.AsyncTask;
import android.util.Log;

/**
 * Created by SuperD on 2017/3/15.
 * 异步任务的测试类
 */

public class TestAsyncTask extends AsyncTask<Integer, Integer, Void> {
    private static final String TAG = "TestAsyncTask";

    /**
     * 当前方法在主线程(UI)线程执行
     */
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        Log.d(TAG, "异步任务准备阶段");
        Log.d(TAG, "当前线程 : " + Thread.currentThread().getId() + "");
    }

    /**
     * 当前方法在线程池创建的子线程中执行.
     *
     * @param params
     * @return
     */
    @Override
    protected Void doInBackground(Integer... params) {
        int count = params.length;
        for (int i = 0; i < count; i++) {
            //做判断取消处理
            if (isCancelled()) {
                break;
            }
            try {
                Log.d(TAG, "执行" + params[i]);
                Log.d(TAG, "当前线程 : " + Thread.currentThread().getId() + "");
                //展示执行进度
                publishProgress((int) (i / ((float) count) * 100));
                Thread.currentThread().sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        return null;

    }

    /**
     * 执行线程主线程
     *
     * @param values
     */
    @Override
    protected void onProgressUpdate(Integer... values) {
        super.onProgressUpdate(values);
        int progress = values[0];
        Log.d(TAG, "当前执行进度" + "%" + progress);
        Log.d(TAG, "当前线程 : " + Thread.currentThread().getId() + "");
    }

    /**
     * 任务完成
     * 执行线程 :主线程
     *
     * @param aVoid
     */
    @Override
    protected void onPostExecute(Void aVoid) {
        super.onPostExecute(aVoid);
        Log.d(TAG, "异步任务完成阶段阶段");
        Log.d(TAG, "当前线程 : " + Thread.currentThread().getId() + "");
    }

    @Override
    protected void onCancelled() {
        super.onCancelled();
        Log.d(TAG, "异步任务停止");
        Log.d(TAG, "当前线程 : " + Thread.currentThread().getId() + "");
    }
}

MainActivity.java

//执行测试的异步任务
new TestAsyncTask().execute(1,2,3,4,5);

然后观察打印结果,和上面的流程图会更好的AsyncTask的核心方法的执行过程。


参考文章

1.Android开发艺术探索 P391

猜你喜欢

转载自blog.csdn.net/l540675759/article/details/62264615