AsyncTask之方法解析一:doInBackground(Params … params)
1.在onPreExecute()方法执行结束之后该方法会被自动调用;
2.该方法在子线程中执行,通常做一些耗时操作;
3.该方法中的可变参数params是由AsyncTask子类对象调用execute(Params … params)方法时传递而来,该参数的类型由AsyncTask类上的第一个泛型限定;
4.该方法的返回值将会传递给onPostExecute(Result … result)方法作为参数使用,返回值类型由AsyncTask类上的第三个泛型限定;
5.在该方法中可以调用publishProgress(Progress … progress)发布任务完成的进度,该进度值progress将会被发布到主线程onUpdateProgress(Progress … progress)方法中,作为该方法的参数使用。
AsyncTask之方法解析二:onPreExecute()
1.该方法在主线程中执行;
2.该方法在任务开始前执行,通常用来初始化任务,比如向用户展示一个进度条。
AsyncTask之方法解析三:onPostExecute(Result … result)
1.该方法在主线程中执行;
2.该方法在耗时操作完成后执行,即在doInBackground(Params … params)方法结束后执行;
3.该方法的参数resu
lt是耗时操作返回的结果,即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; 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)传递而来
h (InterruptedException e) {
e.printStackTrace();
}
}
return sum;
}
/**
-
执行在主线程,向用户展示任务的进度
-
@param values 该参数由publishProgress(Progress … progress)传递而来