AsyncTask類在子線程對UI進行操作
繼承AsyncTask類時指定三個參數:<Params, Progress, Result>
Params 傳入的泛型參數
Progress 整形
Result 回報結果
class RecyclerViewTask extends AsyncTask<Void, Integer, String> {
//背景任務開始執行前調用,用于界面的初始化操作
onPreExecunte(){}
//這個方法的代碼會在子線程中運作,在這裡處理耗時任務。任務完成後,通過return語句傳回結果。這個方法不能進行UI操作
doInBackground(){}
//
}
使用AsyncTask
package com.test.admin.test;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void onClick(View view){
new pro().execute();
}
//
class pro extends AsyncTask<Void,Integer,Boolean>{
ProgressDialog progressDialog=new ProgressDialog(MainActivity.this);
//在背景任務開始執行前調用,用于進行一些界面的初始化,如顯示進度條對話框等
@Override
protected void onPreExecute() {
progressDialog.setTitle("正在更新");
progressDialog.setMessage("loading");
//是否能用回退鍵取消界面
progressDialog.setCancelable(true);
progressDialog.show();
}
//裡面所有的代碼都會在子線程執行,處理所有的耗時任務,完後成通過retrun傳回執行結果。
//如果AsyncTask第三個參數是void,則不可傳回結果。
//這個方法不能進行UI操作,如需要更新UI元素,目前任務進度,可調用publishProgress(Progress...)完成
@Override
protected Boolean doInBackground(Void... params) {
for(int i=1;i<=100;i++){
try {
//延遲
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
publishProgress(i);
if (i==100){
break;
}
}
return true;
}
//在背景任務中調用了publishProgress(Progress...)方法後會調用該方法,在此方法中進行UI操作。
@Override
protected void onProgressUpdate(Integer... values) {
progressDialog.setMessage("Downloaded"+values[0]+"%");
}
//當背景任務執行完畢并通過retrun語句進行傳回時,這個方法會被調用傳回的資料作為參數傳到此方法。
// 可利用該參數進行UI操作,如提醒任務執行結果,關閉進度條等
@Override
protected void onPostExecute(Boolean aBoolean) {
if (aBoolean){
progressDialog.dismiss();
Toast.makeText(MainActivity.this,"下載下傳成功",Toast.LENGTH_SHORT).show();
}
}
}
}
運作結果
水準進度條的顯示
在onPreExecute方法裡添加
// 設定水準進度條
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
// 設定提示的title的圖示,預設是沒有的
//progressDialog.setIcon(R.mipmap.ic_launcher);
//設計進度條最大值,預設100
//progressDialog.setMax(1000);
//更新進度條進度,1是1倍增量
progressDialog.incrementProgressBy(1);
//二級進度條更新方式
//progressDialog.incrementSecondaryProgressBy(2);