AsyncTask 异步线程 用法

AsyncTask介绍
Android的AsyncTask比Handler更轻量级一些,适用于简单的异步处理。首先明确Android之所以有Handler和AsyncTask,都是为了不阻塞主线程(UI线程),且UI的更新只能在主线程中完成,因此异步处理是不可避免的。Android为了降低这个开发难度,提供了AsyncTask。AsyncTask就是一个封装过的后台任务类,顾名思义就是异步任务。AsyncTask直接继承于Object类,位置为android.os.AsyncTask。要使用AsyncTask工作我们要提供三个泛型参数,并重载几个方法(至少重载一个)。

AsyncTask定义了三种泛型类型 Params,Progress和Result。

Params 启动任务执行的输入参数,比如HTTP请求的URL。
Progress 后台任务执行的百分比。
Result 后台执行任务最终返回的结果,比如String。

public class MyAsyncTask extends AsyncTask<Integer, Integer, Integer> {....}

根据我们的需要重写以下方法:

(1)doInBackground(Params…) 后台执行,比较耗时的操作都可以放在这里。注意这里不能直接操作UI。此方法在后台线程执行,完成任务的主要工作,通常需要较长的时间。在执行过程中可以调用publicProgress(Progress…)来更新任务的进度。(此方法必须重写


(2)onPostExecute(Result) 相当于Handler 处理UI的方式,方法参数就是在doInBackground 得到的处理结果,此方法在主线程执行可以操作UI。 

(3)onProgressUpdate(Progress…) 可以使用进度条增加用户体验度。 此方法在主线程执行,用于显示任务执行的进度。(如果是用此方法必须在doInBackground方法中使用publicProgress它传入进度值


(4)onPreExecute() 这里是最终用户调用Excute时的接口,当任务执行之前开始调用此方法,可以在这里显示进度对话框。


(5)onCancelled() 用户调用取消时被触发。


注意以下情况:

(1)AsyncTask的实例必须在UI thread中创建;
(2)execute方法必须在UI thread中调用;同一个实例只能执行一次execute方法。多次调用时将会抛出异常。

例子:

public class MyAsyncTask extends AsyncTask<Integer, Integer, Integer> {

    TextView txtView;
    ProgressBar pb;

    public MyAsyncTask(TextView txtView, ProgressBar pb) {
        this.txtView = txtView;
        this.pb = pb;
    }

    /**
     * 后台执行方法,比较耗时的操作都可以放在这里。注意这里不能直接操作UI。此方法在后台线程执行,
     * 完成任务的主要工作,通常需要较长的时间。在执行过程中可以调用publicProgress()来更新任务的进度。
     * 这里的参数对应AsyncTask的第一个参数, 这里的返回值对应AsyncTask,第三个参数。
     */
    @Override
    protected Integer doInBackground(Integer... params) {

        int num = 0;
        for (int i = 0; i < params[0]; i++) {
            num += i;

            publishProgress(i);// 注意:如果要在onProgressUpdate方法更新处理进度。这个方法必须加。
            try {

                Thread.sleep(500);// 模拟任务处理时间

            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        return num;
    }

    /**
     * 这里的Integer参数对应AsyncTask中的第三个参数(这个值就是doInBackground的返回值)
     * 在doInBackground方法执行结束之后在运行,并且运行在UI线程当中 可以对UI空间进行设置
     */
    @Override
    protected void onPostExecute(Integer result) {
        txtView.setText("结果:" + String.valueOf(result));
        super.onPostExecute(result);
    }

    /**
     * 当任务执行之前开始调用此方法,可以在这里提示用户任务已经开始执行了。 该方法运行在UI线程当中,并且运行在UI线程当中 可以对UI空间进行设置
     */
    @Override
    protected void onPreExecute() {
        txtView.setText("请稍等那边正在处理呢");
        super.onPreExecute();
    }

    /**
     * 进度更新方法,此方法运行在UI线程中,因此可以操作UI
     * 这里的参数是在doInBackground方法中通过publishProgress方法传入的。
     */
    @Override
    protected void onProgressUpdate(Integer... values) {
        pb.setProgress(values[0]);
        super.onProgressUpdate(values);
    }

    /**
     * 取消AsyncTask任务时出发。Integer参数是取消的时候doInBackground已经处理的结果。
     */
    @Override
    protected void onCancelled(Integer result) {
        super.onCancelled(result);
    }

}
View Code

在Acitivity中调用

MyAsyncTask task=new MyAsyncTask(txtview1,progressBar1);

task.excute(1000);//对应AsyncTask的第一个参数

task.cancel(boolean);//取消任务,这个方法很有意思。有兴趣的可以查查。

原文地址:https://www.cnblogs.com/ywtk/p/3817975.html