1.什么是Asynctask?
异步任务,一般用来更新UI进程,比较耗时的操作可以在里面进行(短时间)。本质上就是一个封装了线程池和Handler的异步框架。
2.使用 三个参数 5个方法
public class MainActivity extends AppCompatActivity {
private Button execute;
private Button cancel;
private ProgressBar progressBar;
private TextView textView;
private MyTask mTask;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
progressBar = findViewById(R.id.progress_bar);
textView = findViewById(R.id.text_view);
execute = findViewById(R.id.execute);
cancel = (Button) findViewById(R.id.cancel);
execute.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//注意每次需要new一个实例,新建的任务只能执行一次,否则会出现异常。
mTask = new MyTask();
mTask.execute();
execute.setEnabled(false);
cancel.setEnabled(true);
}
});
cancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//取消一个正在执行的任务,onCancelled方法将会被调用
mTask.cancel(true);
}
});
}
class MyTask extends AsyncTask<String, Integer, String> {
//用于在执行后台任务前做一些UI操作
@Override
protected void onPreExecute() {
super.onPreExecute();
textView.setText("loading...");
}
//内部执行后台任务,不可在此方法内修改UI
@Override
protected String doInBackground(String... params) {
int i = 0;
while (i<100){
i=i*2;
publishProgress(i);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return null;
}
//用于更新进度信息
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
progressBar.setProgress(values[0]);
textView.setText("loading..." + values[0] + "%");
}
//用于在执行完后台任务后更新UI,显示结果
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
textView.setText(result);
execute.setEnabled(true);
cancel.setEnabled(false);
}
//在取消执行中的任务时更改UI
@Override
protected void onCancelled() {
super.onCancelled();
textView.setText("cancelled");
progressBar.setProgress(0);
execute.setEnabled(true);
cancel.setEnabled(false);
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<Button
android:id="@+id/execute"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="execute"/>
<Button
android:id="@+id/cancel"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:enabled="false"
android:text="cancel"/>
<ProgressBar
android:id="@+id/progress_bar"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:progress="0"
android:max="100"
style="?android:attr/progressBarStyleHorizontal"/>
<ScrollView
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/text_view"
android:layout_width="fill_parent"
android:layout_height="wrap_content"/>
</ScrollView>
</LinearLayout>
3.机制原理
1)AsyncTask本质是一个静态的线程池,AsyncTask派生出的子类可以实现不同的异步任务,这些任务都是提交到静态线程池中执行;
2)线程池中的工作线程执行DoInBackground(mParams)方法执行异步任务
3)当任务状态改变后,工作线程会向UI线程发送消息,AsyncTask内部的InternalHandler响应这些消息,并调用相关的回调函数。
网友评论