
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);
}
}