Android——AsyncTask

AsyncTask简单介绍

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

AsyncTask是一个抽象类,我们在使用时需要定义一个它的派生类并重写相关方法。如下:

public abstract class AsyncTask<Params, Progress, Result>

AsyncTask还是一个泛型类

  • Params 启动任务执行的输入参数,比如HTTP请求的URL doInBackground

  • Progress 后台任务执行的百分比。

  • Result 后台执行任务最终返回的结果,比如String

使用AsyncTask 的一个异步加载数据最少要重写以下这两个方法:

onPreExecute() //此方法会在后台任务执行前被调用,用于进行一些准备工作

doInBackground(Params... params) //此方法中定义要执行的后台任务,在这个方法中可以调用publishProgress来更新任务进度(publishProgress内部会调用onProgressUpdate方法)

onProgressUpdate(Progress... values)//publishProgress内部调用,表示任务进度更新

onPostExecute(Result result) //后台任务执行完毕后,此方法会被调用,参数即为后台任务的返回结果

onCancelled() //此方法会在后台任务被取消时被调用

 

例子:使用AsyncTask模拟下载图片

Xml

...

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/notify_info"
    android:textSize="18sp"
    android:text="提示内容" />
<Button
    android:layout_width="206dp"
    android:layout_height="wrap_content"
    android:id="@+id/dL"
    android:text="下载图片"/>

<ProgressBar
    android:id="@+id/progressBar"
    style="?android:attr/progressBarStyleHorizontal"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

...

 

mainActivity.class

package com.example.asynctask_download_demo;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {
    private TextView info;
    private ProgressBar pb;
    private Button button;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        info = (TextView) findViewById(R.id.notify_info);
        pb= (ProgressBar) findViewById(R.id.progressBar);
        button= (Button) findViewById(R.id.dL);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ProgressBarAsyncTask progressBarAsyncTask = new ProgressBarAsyncTask(info,pb);
                progressBarAsyncTask.execute(1000);
            }
        });
    }
}

ProgressBarAsyncTask.class

package com.example.asynctask_download_demo;
import android.os.AsyncTask;
import android.widget.ProgressBar;
import android.widget.TextView;


public class ProgressBarAsyncTask extends AsyncTask<Integer,Integer,String> {

    private TextView textView;
    private ProgressBar progressBar;

    public ProgressBarAsyncTask(TextView textView, ProgressBar progressBar) {
        super();
        this.textView = textView;
        this.progressBar = progressBar;
    }
    @Override
    protected String doInBackground(Integer... params) {
        NetOperator netOperator = new NetOperator();
        int i=0;
        for ( i=0;i<100;i++){
            netOperator.operator();
            publishProgress(i);
        }
        return i+params[0].intValue()+"";
    }

    @Override
    protected void onPreExecute() {
        textView.setText("开始执行异步线程");
    }
    @Override
    protected void onPostExecute(String s) {
        textView.setText("异步操作执行结束"+s);
    }
    @Override
    protected void onProgressUpdate(Integer... values) {
        int value = values[0];
        progressBar.setProgress(value);
    }
}

NetOperator.class

//模拟网络环境
public class NetOperator {
    public void operator(){
        try {
            //休眠1秒
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

posted @ 2017-04-26 14:20  lusCodding  阅读(170)  评论(0编辑  收藏  举报