天天看点

Android AsyncTask 异步任务

异步任务 AsyncTask

​ 

为了解决 新线程 不能更新 UI组件的问题, Android 提供了如下几种方法:

(1) Handler 实现线程之间的通信。

(2) Activity.runOnUiThread(Runnable);

(3) View.post(Runnalbe)

(4) View.postDelayed(Runnable ,long)

后三种要繁琐一些。 而异步任务则可以进一步简化这些操作。

AsyncTask <Params, Progress, Result> 三个泛型参数

Params: 启动任务执行的输入参数的类型。

Progress: 后台任务完成的进度值的类型。

Result: 后台任务完成后返回结果的类型。

如果没有参数的话可以写为 Void。

根据需要可以实现 AsyncTask 的不同方法

doInBackground()    重写该方法就是后台要完成的任务,该方法可以调用 publishProgress 方法来更新进度。

onProgressUpdate() 调用 publishProgress 时将会触发该方法。

onPreExecute()         在执行耗时任务前来调用,一般来做一些初始化工作,比如在界面上显示进度条。

onPostExcute()          当 doInBackground 执行完后会自动调用。并将返回值传给他。

使用步骤

1. 创建 AsyncTask 子类。

2. 选择实现 AsyncTask 的不同方法。

3. 调用子类的 execute() 方法开始执行耗时任务。

注意

必须在 UI 线程中创建 AsyncTask 实例。

必须在 UI 线程中调用 实例的 execute() 方法。

上述四个方法 不应该有程序员调用,而应该是由系统调用。

每个 AsyncTask 实例只能被执行一次,执行多次将会引发异常。

示例代码:

<span style="font-size:18px;">package com.serviatech.asynctasktest;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ProgressBar;

/** 利用异步任务来更新进度条 */
public class MainActivity extends Activity {

  private ProgressBar pb;

  private final int PB_MAX = 100;
  private final String TAG = "MainActivity";

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    pb = (ProgressBar) findViewById(R.id.pb);
    pb.setMax(PB_MAX);
  }

  public void startAsyncTask(View view) {

    MyAsyncTask myAsyncTask = new MyAsyncTask();
    myAsyncTask.execute(null, null, null);
  }

  private class MyAsyncTask extends AsyncTask<Void, Void, Void> {

    @Override
    protected Void doInBackground(Void... params) {
      // TODO Auto-generated method stub

      int count = 0;
      while (true) {

        Log.d(TAG, "--- count= " + count++ + " ---");
        try {
          Thread.sleep(60);
        } catch (InterruptedException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
        }
        pb.setProgress(count);
        if (count == 100)
          break;
      }
      return null;
    }

  }
}
</span>