AsyncTask的简单使用

耗时操作和更新UI结合,以前用过Handler。就是新开线程,处理耗时操作,然后通过发送信息,Handler在UI线程更新UI。

Android提供一个已经封装好的类AsyncTask,我们只需重写它的几个方法就行。

//在execute(Params... params)被调用后立即执行,在doInBackground之前调用,UI线程
onPreExecute() 

//当doInBackground结束时,此方法将会被调用,UI线程
onPostExecute(Object o)


//用于更新UI
onProgressUpdate(Object[] values)

//耗时操作,在执行过程中可以调用publishProgress来更新进度信息
doInBackground(Object[] params)

 

下面是一个例子。

在MainActivity里面实例化一个自定义AsyncTask,然后开始执行。

这个自定义的AsyncTask每隔5s使进度条增加10%

 

布局文件(一个TextView,一个Button,一个进度条)

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.administrator.test.MainActivity">

     <TextView
        android:id="@+id/textView01"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        />

    <ProgressBar
        android:id="@+id/progressBar02"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        style="@android:style/Widget.ProgressBar.Horizontal"

        android:layout_below="@+id/textView01"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_marginTop="56dp" />

    <Button
        android:id="@+id/button03"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="更新progressbar"
        android:layout_marginTop="133dp"
        android:layout_below="@+id/textView01"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true" />

</RelativeLayout>

 

自定义的AsyncTask

public class ProgressBarAsyncTask extends AsyncTask {

    private TextView textView;
    private ProgressBar progressBar;


    public ProgressBarAsyncTask(TextView textView, ProgressBar progressBar) {
        super();
        this.textView = textView;
        this.progressBar = progressBar;
    }

    //在execute(Params... params)被调用后立即执行,在后台操作之前调用,UI线程
    @Override
    protected void onPreExecute() {
        textView.setText("开始执行异步线程");
    }

    //当后台操作结束时,此方法将会被调用,UI线程
    @Override
    protected void onPostExecute(Object o) {
        textView.setText("异步操作执行结束");
    }

    //用于更新UI
    //有个很奇怪的问题 如果改了系统默认的参数,会导致调用失败,所以只能在这里面做一下类型转换
    //就是不能重载吧
    @Override
    protected void onProgressUpdate(Object[] values) {

       int temp =  Integer.parseInt(values[0]+"");
        Log.d("TAG",temp+"");
        progressBar.setProgress(temp);
    }

    //后台做的事情,耗时操作,在执行过程中可以调用publishProgress(Progress... values)来更新进度信息
    @Override
    protected Object doInBackground(Object[] params) {

        //5s加载10%

        for(int i=1;i<=10;i++){

            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            Log.d("TAG",i+"");

            //在doInBackground方法当中,,每次调用publishProgress方法都会触发onProgressUpdate执行
            publishProgress(i*10);


        }

        return null;
    }
}

 

MainActivity

public class MainActivity extends AppCompatActivity {

    private Button button;
    private ProgressBar progressBar;
    private TextView textView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        button = (Button)findViewById(R.id.button03);
        progressBar = (ProgressBar)findViewById(R.id.progressBar02);
        textView = (TextView)findViewById(R.id.textView01);

        progressBar.setMax(100);
        progressBar.setProgress(0);

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                ProgressBarAsyncTask asyncTask = new ProgressBarAsyncTask(textView, progressBar);
                asyncTask.execute();

            }
        });


    }
}

 

效果

 

posted @ 2016-11-15 21:57  wzb的QQ空间  阅读(315)  评论(0编辑  收藏  举报