Android AsyncTask Demo

Android AsyncTask Demo

MainActivity.java

package com.vision.myapplicationtest;

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

public class MainActivity extends AppCompatActivity {


    MyTask myTask;
    private Button button1;
    private Button button2;
    private ProgressBar progressBar;
    private TextView textView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                /**
                 * 步骤3:手动调用execute(Params... params) 从而执行异步线程任务
                 * 注:
                 *    a. 必须在UI线程中调用
                 *    b. 同一个AsyncTask实例对象只能执行1次,若执行第2次将会抛出异常
                 *    c. 执行任务中,系统会自动调用AsyncTask的一系列方法:onPreExecute() 、doInBackground()、onProgressUpdate() 、onPostExecute()
                 *    d. 不能手动调用上述方法
                 */
                myTask = new MyTask(textView, progressBar);
                myTask.execute();

            }
        });
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 取消一个正在执行的任务,onCancelled方法将会被调用
                myTask.cancel(true);
            }
        });
    }

    private void initView() {
        button1 = (Button) findViewById(R.id.button1);
        button2 = (Button) findViewById(R.id.button2);
        progressBar = (ProgressBar) findViewById(R.id.progressBar);
        textView = (TextView) findViewById(R.id.textView);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        myTask.cancel(true);
    }
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:gravity="center_horizontal"
    android:orientation="vertical"
    tools:context=".MainActivity">


    <Button
        android:id="@+id/button1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="开始" />

    <Button
        android:id="@+id/button2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="停止" />

    <ProgressBar
        android:id="@+id/progressBar"
        android:layout_margin="4dp"
        style="?android:attr/progressBarStyleHorizontal"
        android:progressDrawable="@drawable/progressbar_loading_line"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView" />
</LinearLayout>

progressbar_loading_line.xml

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">



    <item android:id="@android:id/progress">

        <clip>

            <shape>

                <gradient
                    android:endColor="#3023AE"
                    android:startColor="#C96DD8"/>
            </shape>
        </clip>
    </item>

</layer-list>

MyTask.java

package com.vision.myapplicationtest;

import android.os.AsyncTask;
import android.util.Log;
import android.widget.ProgressBar;
import android.widget.TextView;

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

    private static final String TAG = "MyTask";

    TextView textView;
    ProgressBar progressBar;

    public MyTask() {
    }

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

    // 方法1:onPreExecute()
    // 作用:执行 线程任务前的操作
    @Override
    protected void onPreExecute() {
        textView.setText("加载中...");
    }

    // 方法2:doInBackground()
    // 作用:接收输入参数、执行任务中的耗时操作、返回 线程任务执行的结果
    // 此处通过计算从而模拟“加载进度”的情况
    @Override
    protected String doInBackground(String... strings) {
        try {
            int count = 0;
            int length = 1;
            while (count < 99) {
                count += length;
                // 可调用publishProgress()显示进度, 之后将执行onProgressUpdate()
                publishProgress(count);
                // 模拟耗时任务
                Thread.sleep(5);
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return null;
    }

    // 方法3:onProgressUpdate()
    // 作用:在主线程 显示线程任务执行的进度
    @Override
    protected void onProgressUpdate(Integer... progresses) {
        progressBar.setProgress(progresses[0]);
        textView.setText("loading..." + progresses[0] + "%");
    }

    // 方法4:onPostExecute()
    // 作用:接收线程任务执行结果、将执行结果显示到UI组件
    @Override
    protected void onPostExecute(String s) {
        // 执行完毕后,则更新UI
        textView.setText("加载完毕");
    }

    // 方法5:onCancelled()
    // 作用:将异步任务设置为:取消状态
    @Override
    protected void onCancelled() {
        textView.setText("已取消");
        progressBar.setProgress(0);
    }

}

上一篇:音量调节条-封装通用的ProgressBar组件


下一篇:[BZOJ 4311] 向量