AsyncTask執行和取消Demo
阿新 • • 發佈:2018-12-10
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);
}
}