AsyncTask

1.什么是AsyncTask?

AsyncTask是Android提供的轻量级的异步类。

2.如何使用AsyncTask?

(1)新建内部类继承AsyncTask

  (2)定义AsyncTask的三种泛型参数(注:泛型参数指任意类型的参数)

(3)重写doInBackground方法(完成耗时操作)

(4)重写onPreExcute方法

(5)重写onProgressUpdate方法

(6)重写onPostExcute方法

(7)在需要重启的地方调用excute方法

3.使用AsyncTask做倒计时

AsyncTask

AsyncTask

AsyncTask

如图所示,这是用AsyncTask实现的计时器的程序。

xml文件中的代码如下:

<EditText
    android:gravity="center"
    android:textSize="40sp"
    android:id="@+id/setting_et"
    android:layout_width="match_parent"
    android:layout_height="100dp" />

<Button
    android:id="@+id/download_btn"
    android:layout_width="match_parent"
    android:layout_height="60dp"
    android:layout_centerInParent="true"
    android:text="开始计时" />

<TextView
    android:layout_below="@id/setting_et"
    android:id="@+id/window_tv"
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:textSize="30sp"
    android:gravity="center"
    android:text="倒计时" />

java文件中的代码如下:

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

public class AsyncTaskActivity extends AppCompatActivity {
    private Button downloadBTN;
    private TextView windowTV;
    private EditText settingET;


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

        downloadBTN.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

               int time=Integer.parseInt(settingET.getText().toString());//将字符串转换成整形
                new MyTask().execute(time);
            }
        });
    }

    private void bindID() {
        downloadBTN = findViewById(R.id.download_btn);
        windowTV = findViewById(R.id.window_tv);
        settingET = findViewById(R.id.setting_et);
    }


    class MyTask extends AsyncTask<Integer, Integer, String> {




        @Override
        protected String doInBackground(Integer... integers) {
          for(int i=integers[0];i>=0;i--){
           try{
               Thread.sleep(1000);
               publishProgress(i);//调用onProgressUpdate方法
           } catch (InterruptedException e) {
               e.printStackTrace();
           }
          }
            return "计时结束";
        }



        @Override
        protected void onProgressUpdate(Integer... values) {
            super.onProgressUpdate(values);
            windowTV.setText(values[0]+""  );
        }



        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            windowTV.setText(s);
        }


    }
}

首先,我们先将xml文件中的控件声明,其次绑定ID。在onCreate生命周期中我们为Button设置监听事件。

我们创建一个MyTask类(括号中的3个参数可为任意类型),在此类中,我们创建出doInBackground,onProgressUpdate,onPostExcute 方法。

在doInBackground方法中我们创建一个for循环来实现计数的操作(耗时操作)

int time=Integer.parseInt(settingET.getText().toString());//将字符串转换成整形
 new MyTask().execute(time);

该串代码为将字符串转换为整型与启动MyTask类

4.使用AsyncTask做进度条

AsyncTask

我们用ProgressBar实现进度条效果。xml文件中的代码如下:

<ProgressBar
    android:id="@+id/pb1"
    style="?android:attr/progressBarStyleHorizontal"
    android:layout_width="match_parent"
    android:layout_height="10dp"
    android:layout_marginTop="50dp"
    android:max="200"
    android:progress="0"
    android:visibility="visible" />
<ProgressBar
    android:layout_below="@+id/pb1"
    android:id="@+id/pb2"
    style="?android:attr/progressBarStyleHorizontal"
    android:layout_width="match_parent"
    android:layout_height="10dp"
    android:layout_marginTop="50dp"
    android:max="200"
    android:progress="0"
    android:visibility="visible" />

<Button
    android:id="@+id/btn1"
    android:layout_width="200dp"
    android:layout_height="50dp"
    android:layout_centerInParent="true"
    android:text="开始下载" />

java文件中的代码如下:

import android.os.AsyncTask;
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 ProgressBarActivity extends AppCompatActivity implements View.OnClickListener {
    private Button BTN1;
    private Button BTN2;
    private ProgressBar PB1;
    private ProgressBar PB2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_progress_bar);

        bindID();
    }

    private void bindID() {
        BTN1 = findViewById(R.id.btn1);
        BTN2 = findViewById(R.id.btn2);
        PB1 = findViewById(R.id.pb1);
        PB2 = findViewById(R.id.pb2);

        BTN1.setOnClickListener(this);
        BTN2.setOnClickListener(this);

        PB1.setMax(10);
    }


    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.btn1:
                BTN1.setEnabled(false);
                BTN1.setText("正在下载");
                new MyTask().execute();
                break;
        }

    }


    class MyTask extends AsyncTask<Integer, Integer, Integer> {


        @Override
        protected Integer doInBackground(Integer... integers) {
            for (int i = 0; i < 10; i++) {
                try {
                    Thread.sleep(1000);
                    publishProgress(i);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

            return null;
        }

        @Override
        protected void onProgressUpdate(Integer... values) {
            super.onProgressUpdate(values);
            PB1.setProgress(values[0]);
        }

        @Override
        protected void onPostExecute(Integer integer) {
            super.onPostExecute(integer);
            BTN1.setText("下载完成");
            BTN1.setEnabled(true);

        }
    }
}
如同倒计时程序,首先声明控件,然后绑定ID,在doInBackground生命周期中用for循环实现计数操作。


5.Excute和excuteOnExcutor的区别

Excute(),是串行,excuteOnExcutor是并行(最多5个同时进行)

6我更喜欢,AsyncTask,因为它更简洁。