欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android AsyncTask 后監(jiān)聽異步加載完畢的動(dòng)作詳解

 更新時(shí)間:2016年11月15日 11:47:35   作者:Terry_龍  
這篇文章主要介紹了Android 使用AsyncTask 后監(jiān)聽異步加載完畢的動(dòng)作的相關(guān)資料,需要的朋友可以參考下

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)用這里面的代碼                    }
                  });

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

相關(guān)文章

  • Android OkHttp代理與路由的徹底理解

    Android OkHttp代理與路由的徹底理解

    這篇文章主要為大家介紹了Android OkHttp代理與路由的徹底理解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • Flutter 仿微信支付界面

    Flutter 仿微信支付界面

    網(wǎng)傳微信支付頁面的第三方鏈接一個(gè)格子需要廣告費(fèi)1一個(gè)億,微信支付頁非常適合做功能導(dǎo)航,本篇使用 ListView和 GridView 模仿了微信支付的頁面,同時(shí)介紹了如何裝飾一個(gè)組件的背景和邊緣樣式。
    2021-05-05
  • Android學(xué)習(xí)教程之日歷控件使用(7)

    Android學(xué)習(xí)教程之日歷控件使用(7)

    這篇文章主要為大家詳細(xì)介紹了Android學(xué)習(xí)教程之日歷控件操作代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • Java4Android開發(fā)教程(二)hello world!

    Java4Android開發(fā)教程(二)hello world!

    一般的開發(fā)教程都是介紹完安裝配置開發(fā)環(huán)境,緊接著來一篇hello world,算是國際慣例吧,我們當(dāng)然也不能免俗,哈哈,各位看官請看好了!
    2014-10-10
  • Android編程簡單解析JSON格式數(shù)據(jù)的方法示例

    Android編程簡單解析JSON格式數(shù)據(jù)的方法示例

    這篇文章主要介紹了Android編程簡單解析JSON格式數(shù)據(jù)的方法,結(jié)合實(shí)例形式分析了Android編程解析json格式數(shù)據(jù)的實(shí)現(xiàn)方法與相關(guān)操作技巧,需要的朋友可以參考下
    2017-08-08
  • Android實(shí)現(xiàn)簡單的文件下載與上傳

    Android實(shí)現(xiàn)簡單的文件下載與上傳

    今天小編就為大家分享一篇關(guān)于Android實(shí)現(xiàn)簡單的文件下載與上傳,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • Android在多種設(shè)計(jì)下實(shí)現(xiàn)懶加載機(jī)制的方法

    Android在多種設(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-06
  • Android編程使用HTTP協(xié)議與TCP協(xié)議實(shí)現(xiàn)上傳文件的方法

    Android編程使用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-01
  • Android自定義View九宮格手勢密碼解鎖

    Android自定義View九宮格手勢密碼解鎖

    這篇文章主要為大家詳細(xì)介紹了Android自定義View九宮格手勢密碼解鎖,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • Android中ActionBar以及menu的代碼設(shè)置樣式

    Android中ActionBar以及menu的代碼設(shè)置樣式

    這篇文章主要介紹了Android中ActionBar以及menu的代碼設(shè)置樣式的相關(guān)資料,需要的朋友可以參考下
    2015-07-07

最新評論