1.什么是Asynctask?
異步任務(wù),一般用來更新UI進(jìn)程,比較耗時的操作可以在里面進(jìn)行(短時間)。本質(zhì)上就是一個封裝了線程池和Handler的異步框架。
2.使用? 三個參數(shù)? 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一個實例,新建的任務(wù)只能執(zhí)行一次,否則會出現(xiàn)異常。
? ? ? ? ? ? ? ? mTask = new MyTask();
? ? ? ? ? ? ? ? mTask.execute();
? ? ? ? ? ? ? ? execute.setEnabled(false);
? ? ? ? ? ? ? ? cancel.setEnabled(true);
? ? ? ? ? ? }
? ? ? ? });
? ? ? ? cancel.setOnClickListener(new View.OnClickListener() {
? ? ? ? ? ? @Override
? ? ? ? ? ? public void onClick(View view) {
? ? ? ?//取消一個正在執(zhí)行的任務(wù),onCancelled方法將會被調(diào)用
? ? ? ? ? ? ? ? mTask.cancel(true);
? ? ? ? ? ? }
? ? ? ? });
? ? }
? ? class MyTask extends AsyncTask<String, Integer, String> {
? ? ? ? //用于在執(zhí)行后臺任務(wù)前做一些UI操作
? ? ? @Override
? ? ? ? protected void onPreExecute() {
? ? ? ? ? ? super.onPreExecute();
? ? ? ? ? ? textView.setText("loading...");
? ? ? ? }
//內(nèi)部執(zhí)行后臺任務(wù),不可在此方法內(nèi)修改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;
? ? ? ? }
//用于更新進(jìn)度信息
? ? ? ? @Override
? ? ? ? protected void onProgressUpdate(Integer... values) {
? ? ? ? ? ? super.onProgressUpdate(values);
? ? ? ? ? ? progressBar.setProgress(values[0]);
? ? ? ? ? ? textView.setText("loading..." + values[0] + "%");
? ? ? ? }
//用于在執(zhí)行完后臺任務(wù)后更新UI,顯示結(jié)果
? ? ? ? @Override
? ? ? ? protected void onPostExecute(String result) {
? ? ? ? ? ? super.onPostExecute(result);
? ? ? ? ? ? textView.setText(result);
? ? ? ? ? ? execute.setEnabled(true);
? ? ? ? ? ? cancel.setEnabled(false);
? ? ? ? }
//在取消執(zhí)行中的任務(wù)時更改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.機(jī)制原理
1)AsyncTask本質(zhì)是一個靜態(tài)的線程池,AsyncTask派生出的子類可以實現(xiàn)不同的異步任務(wù),這些任務(wù)都是提交到靜態(tài)線程池中執(zhí)行;
2)線程池中的工作線程執(zhí)行DoInBackground(mParams)方法執(zhí)行異步任務(wù)
3)當(dāng)任務(wù)狀態(tài)改變后,工作線程會向UI線程發(fā)送消息,AsyncTask內(nèi)部的InternalHandler響應(yīng)這些消息,并調(diào)用相關(guān)的回調(diào)函數(shù)。