Asynctask

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ù)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容