1. 程式人生 > >AsyncTask執行和取消Demo

AsyncTask執行和取消Demo

這裡寫圖片描述

AsyncTask

package com.example.zhangyu.myasynctaskdemo;


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

public class MainActivity extends AppCompatActivity {

    private TextView textView;
    private
Button button; private Button button2; UpdateTextTask updateTextTask; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); // } private void initView
() { textView = (TextView) findViewById(R.id.textView); button = (Button) findViewById(R.id.button); button2 = (Button) findViewById(R.id.button2); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { updateTextTask = new
UpdateTextTask(MainActivity.this); updateTextTask.execute(); } }); button2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (updateTextTask != null) /** * 1、如果是true,如果執行緒執行,則會被打斷 * 2、如果是false,執行緒將會被執行執行完成 * * AsyncTask不會不考慮結果而直接結束一個執行緒。 * 呼叫cancel()其實是給AsyncTask設定一個"canceled"狀態。 * 這取決於你去檢查AsyncTask是否已經取消,之後決定是否終止你的操作。 * 對於mayInterruptIfRunning——它所作的只是向執行中的執行緒發出interrupt()呼叫。 * 在這種情況下,你的執行緒是不可中斷的,也就不會終止該執行緒。 */ updateTextTask.cancel(true); } }); } }
package com.example.zhangyu.myasynctaskdemo;


import android.content.Context;
import android.os.AsyncTask;
import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;

public class UpdateTextTask extends AsyncTask<Void, Integer, Integer> {

    private Context context;
    private TextView textView;

    public UpdateTextTask(Context context) {
        this.context = context;
        textView = ((MainActivity) context).findViewById(R.id.textView);
    }

    public UpdateTextTask(Context context, TextView textView) {
    }

    /**
     * 執行在UI執行緒中,呼叫在doInBackground之前
     */
    @Override
    protected void onPreExecute() {
        Toast.makeText(context, "onPreExecute", Toast.LENGTH_SHORT).show();
    }

    /**
     * 後臺執行的方法,可以執行非UI執行緒,可以執行耗時的方法
     *
     * @param voids
     * @return
     */
    @Override
    protected Integer doInBackground(Void... voids) {
        int i = 0;
        while (i < 10) {
            i++;
            publishProgress(i);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            // Task被取消了,馬上退出
            if (isCancelled()) return 0;
        }
        return i;
    }

    /**
     * 在publishProgress被呼叫後,用於更新進度。
     *
     * @param values
     */
    @Override
    protected void onProgressUpdate(Integer... values) {
        textView.setText(values[0] + "");
    }

    /**
     * 執行在UI執行緒,在doInBackground執行完畢後
     *
     * @param integer
     */
    @Override
    protected void onPostExecute(Integer integer) {
        super.onPostExecute(integer);
        Toast.makeText(context, "執行完畢" + integer, Toast.LENGTH_SHORT).show();
    }

    @Override
    protected void onCancelled() {
        super.onCancelled();
        Log.e("TAG", "onCancelled: ");
    }

    @Override
    protected void onCancelled(Integer integer) {
        super.onCancelled(integer);
        Log.e("TAG", "onCancelled: " + integer);
        textView.setText("onCancelled: " + integer);
    }
}