Android AsyncTask 后監(jiān)聽異步加載完畢的動(dòng)作詳解
Android 使用AsyncTask 后監(jiān)聽異步加載完畢的動(dòng)作
AsyncTask 的使用方法網(wǎng)上有很多例子,使用起來也非常的方便。這里就不詳細(xì)說具體的使用方法了,同學(xué)可以Google 一下,很多。
場景模擬
當(dāng)我們在加載一個(gè)列表的時(shí)候,比如GridView ,這時(shí)候我們考慮到不阻塞UI的做法,一般會使用線程Thread 、Timer 或者使用AsyncTask ,而這些操作都是在在后臺另外開一個(gè)線程給我們找數(shù)據(jù),具體得到的數(shù)據(jù)需要使用Handler 去更新UI,AsyncTask 也是一樣使用到的Handler 只是它將Handler 封裝在了onPostExecute 執(zhí)行操作中。而這一操作可能會產(chǎn)生一個(gè)問題,比如你有一個(gè)列表更新數(shù)據(jù)庫使用到的是AsyncTask 異步操作的方式更新UI,而你的需求是當(dāng)我一進(jìn)來這個(gè)列表就統(tǒng)計(jì)這個(gè)列表的數(shù)據(jù)的數(shù)量或者讓某一行數(shù)據(jù)的狀態(tài)為選中狀態(tài)。傳統(tǒng)做法是直接new 一個(gè)AsyncTask 類讓它execute(); 之后會再操作UI。想法是對的,但有一個(gè)問題我們要注意到,因?yàn)樗钱惒郊虞d數(shù)據(jù)的方式,而你的數(shù)據(jù)量比較多或許查找數(shù)據(jù)需要一定的時(shí)間的時(shí)候,這時(shí)使用AsyncTask 執(zhí)行異步加載后更新UI再操作UI對象,可能會報(bào)空指針。
這個(gè)問題的產(chǎn)生是,我們都知道代碼的執(zhí)行是自上而下執(zhí)行,當(dāng)你使用異步加載數(shù)據(jù)的時(shí)候,代碼讓你去執(zhí)行異步操作就不管了(多線程),而繼續(xù)會往下執(zhí)行代碼,你下面的代碼就是操作列表里面的UI,這時(shí)可想而知,異步加載數(shù)據(jù)還沒有結(jié)束還沒有對你的UI進(jìn)行更新,這些你的列表應(yīng)該是空的,而操作一個(gè)空的列表就會報(bào)空指針。
分析問題
使用過AsyncTask 的同學(xué)都知道一個(gè)異步加載數(shù)據(jù)最少要重寫以下這兩個(gè)方法:
doInBackground 后臺執(zhí)行,比較耗時(shí)的操作都可以放在這里。注意這里不能直接操作UI。
onPostExecute 相當(dāng)于Handler 處理UI的方式,在這里面可以使用在doInBackground 得到的結(jié)果處理操作UI。
有必要的話你還得重寫以下這三個(gè)方法,但不是必須的:
onProgressUpdate 可以使用進(jìn)度條增加用戶體驗(yàn)度。
onPreExecute 這里是最終用戶調(diào)用Excute時(shí)的接口
onCancelled 用戶調(diào)用取消時(shí),要做的操作
根據(jù)上面的思路,可以看出,最終數(shù)據(jù)加載并顯示出來這一系列的操作都在onPostExecute 這個(gè)方法里面,那么如何監(jiān)聽所有UI都己經(jīng)在onPostExecute 里面處理完成了,再去執(zhí)行我們自己要操作呢?
解決問題
這里給出我自己解決這一問題的思路,有更好想法的朋友歡迎跟貼共同探討。
首先創(chuàng)建一個(gè)接口
private interface isLoadDataListener { public void loadComplete(); } 聲明這一接口變量
private isLoadDataListener loadLisneter;
給接口賦值,得到接口對象
public void setLoadDataComplete(isLoadDataListener dataComplete) { this.loadLisneter = dataComplete; }
之后在AsyncTask 的onPostExecute處理UI完成后調(diào)用該接口,下面給出一個(gè)我以前項(xiàng)目使用到的AsyncTask 類:
class loadGridAsyncTask extends AsyncTask<Integer, Integer, AppsAdapter> { private int poindex; public loadGridAsyncTask(int positionindex) { this.poindex = positionindex; } @Override protected AppsAdapter doInBackground(Integer... params) { // TODO Auto-generated method stub // mAppsModel.clear(); Cursor temp = dbHelper.queryPageById(poindex); loadPage(mApps, temp); temp.close(); return new AppsAdapter(STB.this, mAppsModel); } @Override protected void onPostExecute(AppsAdapter result) { gridViewExt itemGrid = (gridViewExt) viewFlipper .getChildAt(poindex); itemGrid.setColumnCount(pageColumnCount); itemGrid.setAdapter(result); if (loadLisneter != null) { loadLisneter.loadComplete(); } } }
通過上面的代碼,我們就得到一個(gè)數(shù)據(jù)加載完成后返回的接口,接下來的問題就是我們利用這個(gè)接口來處理我們的UI了,比如讓某一UI選中,得到這個(gè)列表的UI數(shù)量等,看下面的代碼:
new loadGridAsyncTask(1).execute(); setLoadDataComplete(new isLoadDataListener() { @Override public void loadComplete() { // TODO Auto-generated method stub //這里執(zhí)行你要的操作,當(dāng)UI更新完成后會自動(dòng)調(diào)用這里面的代碼 } });
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
- 詳解Android中AsyncTask的使用方法
- Android 中糟糕的AsyncTask
- Android利用AsyncTask異步類實(shí)現(xiàn)網(wǎng)頁內(nèi)容放大縮小
- Android中通過AsyncTask類來制作炫酷進(jìn)度條的實(shí)例教程
- 詳解Android App中的AsyncTask異步任務(wù)執(zhí)行方式
- Android使用AsyncTask實(shí)現(xiàn)多線程下載的方法
- Android中AsyncTask異步任務(wù)使用詳細(xì)實(shí)例(一)
- Android 中使用 AsyncTask 異步讀取網(wǎng)絡(luò)圖片
- 詳解Android中AsyncTask機(jī)制
- Android通過Handler與AsyncTask兩種方式動(dòng)態(tài)更新ListView(附源碼)
- Android中AsyncTask與handler用法實(shí)例分析
相關(guān)文章
Android學(xué)習(xí)教程之日歷控件使用(7)
這篇文章主要為大家詳細(xì)介紹了Android學(xué)習(xí)教程之日歷控件操作代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-11-11Java4Android開發(fā)教程(二)hello world!
一般的開發(fā)教程都是介紹完安裝配置開發(fā)環(huán)境,緊接著來一篇hello world,算是國際慣例吧,我們當(dāng)然也不能免俗,哈哈,各位看官請看好了!2014-10-10Android編程簡單解析JSON格式數(shù)據(jù)的方法示例
這篇文章主要介紹了Android編程簡單解析JSON格式數(shù)據(jù)的方法,結(jié)合實(shí)例形式分析了Android編程解析json格式數(shù)據(jù)的實(shí)現(xiàn)方法與相關(guān)操作技巧,需要的朋友可以參考下2017-08-08Android實(shí)現(xiàn)簡單的文件下載與上傳
今天小編就為大家分享一篇關(guān)于Android實(shí)現(xiàn)簡單的文件下載與上傳,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2018-12-12Android在多種設(shè)計(jì)下實(shí)現(xiàn)懶加載機(jī)制的方法
這篇文章主要介紹了Android在多種設(shè)計(jì)下實(shí)現(xiàn)懶加載機(jī)制的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06Android編程使用HTTP協(xié)議與TCP協(xié)議實(shí)現(xiàn)上傳文件的方法
這篇文章主要介紹了Android編程使用HTTP協(xié)議與TCP協(xié)議實(shí)現(xiàn)上傳文件的方法,結(jié)合實(shí)例形式較為詳細(xì)的分析了Android使用HTTP協(xié)議與TCP協(xié)議的具體步驟與實(shí)現(xiàn)文件傳輸?shù)南嚓P(guān)技巧,需要的朋友可以參考下2016-01-01Android中ActionBar以及menu的代碼設(shè)置樣式
這篇文章主要介紹了Android中ActionBar以及menu的代碼設(shè)置樣式的相關(guān)資料,需要的朋友可以參考下2015-07-07