Android AsyncTask 使用
在Android中在UI线程中做耗时操作时,会引起UI线程的阻塞,出现UI界面的卡顿线程,有时还会引起ANR等异常情况
在Android中的耗时操作推荐通过异步操作来避免阻塞UI线程,AsyncTask
是Android中提供的一个异步操作的框架,
另外在Android中还有Thread
和Handler
,AsyncTask
适用于耗时比较小的操作,如果是需要一个线程长时间在
后台运行,请参考使用 Executor
ThreadPoolExecutor
FutureTask
AsyncTask 使用
private class MyTask extends AsyncTask<String,Integer,String>{
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected String doInBackground(String... params) {
String myString = params[0];
int i = 0;
publishProgress(i);
return "Result";
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
}
}
new MyTask().execute("my string paramaters");//调用并执行
AsyncTask的参数说明
一般的使用的方法
private class MyTask extends AsyncTask<Params, Progress, Result> { ... }
如果不需要参数请使用 Void
private class MyTask extends AsyncTask<Void, Void, Void> { ... }
- Params,这个参数就是在调用时,传递过来的参数
- Progress,耗时操作在后台执行的进度
- Result,后台操作完成之后,返回的结果
方法说明
- onPreExecute(),这个方法中可以更新UI,在耗时操作执行之前的操作
- doInBackground(String... params),这个是主要的方法,所有的耗时的操作需要在这个方法中处理,
在这个方法中可以调用publishProgress(Progress...)
方法来更新操作的进度 - onProgressUpdate(Integer... values),在上一部中调用
publishProgress(Progress...)
方法之后触发,在UI线程中执行
可以给用户操作的进度的显示(如 进度条) - onPostExecute(String result),在耗时操作完成之后,触发这个方法,在UI线程中执行,可以通知用户操作已经完成
使用示例
加载本地图库的照片,并通过GridView显示,核心代码
private void loadAlbum(){
AsyncTask<Void, Void, Void> asyncTask = new AsyncTask<Void, Void, Void>() {
//耗时的操作
@Override
protected Void doInBackground(Void... params) {
Cursor c = getContext().getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
new String[]{MediaStore.Images.ImageColumns.DATA},null,null, MediaStore.Images.ImageColumns.DATE_TAKEN+" desc ");
if(null != c && c.getCount() > 0 && c.moveToFirst()){
while (c.moveToNext()){
mData.add(c.getString(c.getColumnIndex(MediaStore.Images.ImageColumns.DATA)));
}
}
return null;
}
//耗时操作完成之后,调用这个方法,更新UI
@Override
protected void onPostExecute(Void aVoid) {
loadData();
}
};
asyncTask.execute();
}