Android asynctask该如何使用

Android asynctask该如何使用?

AsyncTask在各版本中源码的实现方式不用,但有时我们又需要用到AsyncTask,那我们该怎么使用它呢???

  • Android3.0之前版本,AsyncTask默认线程池sExecutor是多线程的,核心线程数是5;
    AsyncTask Android 2.3源码
  • Android 3.0之后,默认线程池SERIAL_EXECUTOR是串行的;
    AsyncTask Android 4.42 源码阅读

因此,我的使用方式如下:

使用方式

TestAsyncTask mAsyncTask = null;

// 开启异步任务
private void startAsyncTask(Context context) {
    //
    if (mAsyncTask != null
            && mAsyncTask.getStatus() != AsyncTask.Status.FINISHED) {
        return;
    }
    //
    stopAsyncTask();
    //
    mAsyncTask = new TestAsyncTask(context);
    //
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        // 3.0之后默认线程池的串行的
        mAsyncTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
    } else {
        // 3.0 之前
是多线程的
        mAsyncTask.execute();
    }
}

// 停止异步任务
private void stopAsyncTask() {
    if (mAsyncTask != null) {
        if (!mAsyncTask.isCancelled()) {
            mAsyncTask.cancel(true);
        }
        mAsyncTask = null;
    }
}

class TestAsyncTask extends AsyncTask {

    //
    private Context mContext = null;

    public TestAsyncTask(Context context) {
        this.mContext = context;
    }

    @Override
    protected void onPreExecute() {
        // UI 线程...
    }

    @Override
    protected Integer doInBackground(Void... params) {
        // 异步线程...
        return null;
    }

    @Override
    protected void onPostExecute(Integer integer) {
        // UI 线程...
    }

    @Override
    protected void onProgressUpdate(Integer... values) {
        // UI 线程...
        // {@link #publishProgress}在异步线程中被调用后,执行 onProgressUpdate 方法
    }

    @Override
    protected void onCancelled() {
        // UI 线程...
        // 任务被取消后,{@link #onPostExecute}方法不再被执行,会执行 onCancelled 方法
    }
}

你可能感兴趣的:(Android代码)