AsyncTask
AsyncTask是什麼?
- AsyncTask是Android提供的輕量級的異步類,使用AsyncTask可以忽略Looper,MessageQueue,Handler等複雜對象,更便捷的完成異步耗時操作。
AsyncTask怎麼用?
- 在activity中寫一個類部類繼承AsyncTask,並用onProgressUpdate, onPostExecute,onPreExecute,三個方法來運行。
class DownloadTask extends AsyncTask<String,String,String>{
@Override
protected String doInBackground(String... strings) {
}
}
return "null";
}
protected void onProgressUpdate(String... values) {
super.onProgressUpdate(values);
tvdownload.setText(values[0]);
}
protected void onPostExecute(String s) {
super.onPostExecute(s);
tvdownload.setText(s);
}
protected void onPreExecute() {
super.onPreExecute();
tvdownload.setText("正在下載");
}
- 以及放入點擊事件中的new DownloadTask().execute();
btbegin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
new DownloadTask().execute();
}
});
需要實現的幾個方法分別是什麼、有什麼用?
- onPreExecute(),在異步任務執行完成前,系統會用此方法,此方法運行在主線程中,可以修改控件狀態,例如:正在下載。
- doInBackground(Params…), 將在onPreExecute 方法執行後馬上執行,該方法運行在後臺線程中。這裏將主要負責執行那些很耗時的後臺計算工作。可以調用 publishProgress方法來更新實時的任務進度。該方法是抽象方法,子類必須實現。
- onProgressUpdate(Progress…),在publishProgress方法被調用後,UI thread將調用這個方法從而在界面上展示任務的進展情況,例如通過一個進度條進行展示。
- onPostExecute(Result), 當異步任務執行完成後,系統會用此方法,此方法運行在主線程中,可以修改控件狀態,例如:下載完成。
什麼是泛型參數?
- 泛型是Java SE 1.5的新特性,泛型的本質是參數化類型,也就是說所操作的數據類型被指定爲一個參數。這種參數類型可以用在類、接口和方法的創建中,分別稱爲泛型類、泛型接口、泛型方法。
什麼是長度可變的參數列表?
- 可變長度參數列表,其語法就是類型後跟…,表示此處接受的參數爲0到多個Object類型的對象,或者是一個Object[]。
案例解析—倒計時Demo
tvdownload=findViewById(R.id.tv_download);
btbegin=findViewById(R.id.bt_begin);
btbegin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
new DownloadTask().execute();
}
});
}
class DownloadTask extends AsyncTask<String,String,String>{
@Override
protected String doInBackground(String... strings) {
while (count>0){
publishProgress(count+"");
count--;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return "下載完成";
}
@Override
protected void onProgressUpdate(String... values) {
super.onProgressUpdate(values);
tvdownload.setText(values[0]);
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
tvdownload.setText(s);
}
@Override
protected void onPreExecute() {
super.onPreExecute();
tvdownload.setText("正在下載");
}
案例分析–進度條Demo
- 先創建進度條ProgressBar,將圓型進度條變成長條形進度條
<ProgressBar
android:id="@+id/pb"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:max="100" />
- 接下來如上個案例演示差不多的流程,只是稍有不同,可以自己對比找不同。
btdj.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
new Downls().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,1);
btdj.setEnabled(false);
}
});
}
class Downls extends AsyncTask<Integer,Integer,Integer> {
@Override
protected Integer doInBackground(Integer... strings) {
while (count<=100){
publishProgress(count,strings[0]);
count+=10;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return strings[0];
}
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
switch (values[1]){
case 1:
pb.setProgress(values[0]);
break;
}
}
@Override
protected void onPostExecute(Integer s) {
super.onPostExecute(s);
btdj.setText(s);
btdj.setEnabled(true);
}
}