Android AsyncTask 使用
題圖 www.gratisography.com
在Android中在UI線程中做耗時(shí)操作時(shí)堂鲤,會(huì)引起UI線程的阻塞狭莱,出現(xiàn)UI界面的卡頓線程公般,有時(shí)還會(huì)引起ANR等異常情況
在Android中的耗時(shí)操作推薦通過異步操作來避免阻塞UI線程泼橘,AsyncTask
是Android中提供的一個(gè)異步操作的框架,
另外在Android中還有Thread
和Handler
狸吞,AsyncTask
適用于耗時(shí)比較小的操作,如果是需要一個(gè)線程長時(shí)間在
后臺(tái)運(yùn)行指煎,請參考使用 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");//調(diào)用并執(zhí)行
AsyncTask的參數(shù)說明
一般的使用的方法
private class MyTask extends AsyncTask<Params, Progress, Result> { ... }
如果不需要參數(shù)請使用 Void
private class MyTask extends AsyncTask<Void, Void, Void> { ... }
- Params,這個(gè)參數(shù)就是在調(diào)用時(shí)蹋偏,傳遞過來的參數(shù)
- Progress,耗時(shí)操作在后臺(tái)執(zhí)行的進(jìn)度
- Result,后臺(tái)操作完成之后,返回的結(jié)果
參數(shù)的關(guān)系
方法說明
- onPreExecute(),這個(gè)方法中可以更新UI至壤,在耗時(shí)操作執(zhí)行之前的操作
- doInBackground(String... params)威始,這個(gè)是主要的方法,所有的耗時(shí)的操作需要在這個(gè)方法中處理像街,
在這個(gè)方法中可以調(diào)用publishProgress(Progress...)
方法來更新操作的進(jìn)度 - onProgressUpdate(Integer... values)黎棠,在上一部中調(diào)用
publishProgress(Progress...)
方法之后觸發(fā),在UI線程中執(zhí)行
可以給用戶操作的進(jìn)度的顯示(如 進(jìn)度條) - onPostExecute(String result)镰绎,在耗時(shí)操作完成之后脓斩,觸發(fā)這個(gè)方法,在UI線程中執(zhí)行跟狱,可以通知用戶操作已經(jīng)完成
使用示例
加載本地圖庫的照片俭厚,并通過GridView顯示,核心代碼
private void loadAlbum(){
AsyncTask<Void, Void, Void> asyncTask = new AsyncTask<Void, Void, Void>() {
//耗時(shí)的操作
@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;
}
//耗時(shí)操作完成之后驶臊,調(diào)用這個(gè)方法挪挤,更新UI
@Override
protected void onPostExecute(Void aVoid) {
loadData();
}
};
asyncTask.execute();
}