1.该方法在主线程中执行;
2.该方法在耗时操作完成后执行,即在doInBackground(Params … params)方法结束后执行;
3.该方法的参数result是耗时操作返回的结果,即doInBackground(Params … params)返回的结果,参数类型由AsyncTask类上的第三个泛型限定;
AsyncTask之方法解析四:onProgressUpdate(Progress … progress)
1.该方法在主线程中执行;
2.该方法在publishProgress(Progress… progress)每次调用后执行,通常用来向用户展示耗时操作的进度;
3.该方法的参数progress是耗时操作的进度,由publishProgress(Progress … progress)传递而来,参数类型由AsyncTask类上的第二个泛型限定;
了解完以上方法之后,我们就可以开始写个小demo测试一下啦!
public class MainActivity extends AppCompatActivity {
public static final String TAG = “MainActivity”;
private MainActivity context;
private ProgressDialog mDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
context = MainActivity.this;
MyAsyncTask task = new MyAsyncTask();
task.execute(10);//对应类中第一个泛型Integer
}
/**
- 求和异步任务
*/
class MyAsyncTask extends AsyncTask<Integer, Integer, Long> {
/**
- 初始化任务,展示进度条,在主线程
*/
@Override
protected void onPreExecute() {
super.onPreExecute();
Log.d(TAG, "— onPreExecute — " + Thread.currentThread().getName());
mDialog = new ProgressDialog(context);//创建一个进度对话框
mDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
mDialog.show();
}
/**
-
在子线程执行耗时操作,通过publishProgress(Progress … progress)方法将任务执行的进度传出
-
@param params 该参数由task.execute(10);传递而来
-
@return
*/
@Override
protected Long doInBackground(Integer… params) {
long sum = 0;
for (int i = 1
《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
【docs.qq.com/doc/DSkNLaERkbnFoS0ZF】 完整内容开源分享
; i < params[0]; i++) {
sum += i;
publishProgress(params[0], i);//发布进度,参数将传递到onProgressUpdate方法中
try {
Thread.sleep(1000);
Log.d(TAG, "— doInBackground — " + Thread.currentThread().getName() + " i == " + i);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return sum;
}
/**
-
执行在主线程,向用户展示任务的进度
-
@param values 该参数由publishProgress(Progress … progress)传递而来
*/
@Override
protected void onProgressUpdate(Integer… values) {
super.onProgressUpdate(values);
mDialog.setMax(values[0]);
mDialog.setProgress(values[1]);
}
/**
-
执行在主线程,任务执行完成后的操作,隐藏进度条等
-
@param aLong 该参数由doInBackground()返回
*/
@Override
protected void onPostExecute(Long aLong) {
super.onPostExecute(aLong);
//返回操作结果 , 进度对话框消失
mDialog.dismiss();
Log.d(TAG, "— onPostExecute — " + Thread.currentThread().getName() + " aLong == " + aLong);
}
}
}
这个小demo通过求1-10的和,在doInBackground()方法中通过延时的方式模拟了耗时操作,简单的演示了AsyncTask的使用。
Log日志如下:
02-17 09:40:32.214 8207-8207/com.qj.asynctasktest D/MainActivity: — onPreExecute — main
02-17 09:40:33.270 8207-8246/com.qj.asynctasktest D/MainActivity: — doInBackground — AsyncTask #1 i == 1
02-17 09:40:34.273 8207-8246/com.qj.asynctasktest D/MainActivity: — doInBackground — AsyncTask #1 i == 2
02-17 09:40:35.277 8207-8246/com.qj.asynctasktest D/MainActivity: — doInBackground — AsyncTask #1 i == 3
02-17 09:40:36.279 8207-8246/com.qj.asynctasktest D/MainActivity: — doInBackground — AsyncTask #1 i == 4
02-17 09:40:37.280 8207-8246/com.qj.asynctasktest D/MainActivity: — doInBackground — AsyncTask #1 i == 5
02-17 09:40:38.281 8207-8246/com.qj.asynctasktest D/MainActivity: — doInBackground — AsyncTask #1 i == 6
02-17 09:40:39.282 8207-8246/com.qj.asynctasktest D/MainActivity: — doInBackground — AsyncTask #1 i == 7
02-17 09:40:40.284 8207-8246/com.qj.asynctasktest D/MainActivity: — doInBackground — AsyncTask #1 i == 8