AsyncTask是什麼
- AsyncTask是一個抽象類,它是Android封裝的一個輕量級(使用方便,代碼簡介)異步類,它可以在線程中執行後臺任務,然後把執行的進度和最終結果傳遞給主線程並在主線程中更新UI。
- AsyncTask是一個抽象泛型類,它有三個泛型參數
Params:開始異步執行時傳入的參數類型
Progress:異步任務執行過程中,返回下載的進度值的類型
Result:異步任務執行完成後,返回結果類型
如果不需要傳遞具體的參數,則可以用Void來代替
AsyncTask怎麼用
在Activity中採用內部類繼承AsyncTask使用,讓後使用裏面的方法
class DownlondTask extends AsyncTask<String, String,String>//括號內爲三個泛型參數,在這裏用來String
AsyncTask各個方法的作用
onPreExecute():這個方法會在後臺任務開始執行之間調用,在主線程執行。用於進行一些界面上的初始化操作,比如顯示一個進度條對話框等
doInBackground(Params):在這個方法中所有的代碼就會在子線程中運行
注意的是在這個方法中是不能對UI進行操作的
onPostExecute(Result):該方法當doInBackground執行完畢後並通過return語句返回時調用,返回的參數會傳遞到此方法中
onProgressUpdate(Progress…):調用publishProgress()方法後,這個參數就會很快的被調用,方法中攜帶的參數就是在後臺任務中傳遞過來的。 在這個方法中可以進行對UI的操作,在主線程中進行,利用參數中的數值就可以對界面元素進行相應的更新
上面幾個方法的調用順序:
onPreExecute() –> doInBackground() –> publishProgress() –> onProgressUpdate() –> onPostExecute()
什麼是泛型參數
泛型,即“參數化類型”。一提到參數,最熟悉的就是定義方法時有形參,然後調用此方法時傳遞實參。那麼參數化類型怎麼理解呢?顧名思義,就是將類型由原來的具體的類型參數化,類似於方法中的變量參數,此時類型也定義成參數形式(可以稱之爲類型形參),然後在使用/調用時傳入具體的類型(類型實參)。
什麼是長度可變的參數列表
protected void onProgressUpdate(String... values) {
super.onProgressUpdate(values);
tv_show.setText(values[0]);
}
上述代碼中的String… values,String…可以說是一個長度可變的String類型的參數,所以values我們要寫成一個數組
public void add(int...ints){
}
add(1,2,3,4,5)
我們可以在 add方法中無限的添值
案列解析–倒計時Demo
package com.example.dfcn.sexmouth;
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class AsyncTaskActivity extends AppCompatActivity {
private TextView tv_show;
private Button btn_start;
private int time=10;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_async_task);
tv_show=findViewById(R.id.tv_show);
btn_start=findViewById(R.id.btn_start);
btn_start.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
new DownlondTask().execute();//開始執行AsyncTask
}
});
}
class DownlondTask extends AsyncTask<String, String,String>{
@Override
/**
* 在這個方法中所有的代碼就會在子線程中運行
* 注意的是在這個方法中是不能對UI進行操作的
*/
protected String doInBackground(String... strings) {
while (time>0) {
publishProgress(time+"");
try {
Thread.sleep(1000);
time--;
} catch (InterruptedException e) {
e.printStackTrace();
}
}
String s="下載完成";
return String.valueOf(s);
}
@Override
/**
* 該方法當doInBackground執行完畢後並通過return語句返回時調用,返回的參數會傳遞到此方法中
*/
protected void onPostExecute(String s) {
super.onPostExecute(s);
tv_show.setText(s);
}
@Override
/**
* 調用publishProgress()方法後,這個參數就會很快的被調用,方法中攜帶的參數就是在後臺任務中傳遞過來的。
* 在這個方法中可以進行對UI的操作,在主線程中進行,利用參數中的數值就可以對界面元素進行相應的更新
*/
protected void onProgressUpdate(String... values) {
super.onProgressUpdate(values);
tv_show.setText(values[0]);
}
}
}