中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

使用AsyncHttpClient碰到的問題及解決方法

發布時間:2020-08-05 19:53:31 來源:網絡 閱讀:629 作者:天涯花生 欄目:開發技術

之前做一個項目,項目里面的布局是這樣的:一個ViewpagerViewpager里面有三個Fragment,在第二個Fragment里面有一個ListView,使用了BaseAdapter來顯示item。當時因為圖方便,把獲取數據源mData的方法直接寫在了adapter的構造方法里面,數據源通過syncHttpClient向后臺請求參數獲取。

 

大概的代碼如下:

1 private LayoutInflater mInflater;

 2private static List<Map<String, Object>> mData = new ArrayList<Map<String,Object>>();

 3private RequestQueue queue;

 4private ImageLoader p_w_picpathLoader;

 5private Context context;

 6private UserInfoEntity userInfoEntity;

 7

 8public LessonEndingAdapter(Context context) {

 9       this.context = context;

10       mInflater = LayoutInflater.from(context);

11       AuthCheck ac = new AuthCheck();

12       this.userInfoEntity = ac.getUserInfo(context);

13       queue = Volley.newRequestQueue(context);

14       p_w_picpathLoader = new ImageLoader(queue, new BitmapCache());

15       init();

16 }

17 private void init() {

18       mData.clear();

19       String url = Codes.URL_ROOT + "/lesson/studied.api?" +"userid="+ context.getSharedPreferences(Codes.USERINFO,0).getInt(Codes.USERID, 0) + "&token="+ context.getSharedPreferences(Codes.USERINFO,0).getString(Codes.TOKEN, "");

20       SyncHttpClient client = new SyncHttpClient();

21       client.get(url, new JsonHttpResponseHandler() {

22            @Override

23            public void onSuccess(intstatusCode, Header[]    headers,JSONObject response) {

24       super.onSuccess(statusCode, headers, response);

25       if (statusCode == 200) {   

26              processJsonData(response);

27       }

28   }

29  });

30 }

 

這里就不詳細的講SyncHttpClient的用法了,只說說我在使用過程中碰到的一些問題和解決辦法。

 

     當時我在init()中用的是AsyncHttpClient(代碼里面是SyncHttpCilent),沒在意AsyncHttpClientSyncHttpClient的區別,隨意挑了前者,結果問題就出現了:

 

第一次init沒有問題,但是當init操作執行幾次后,頁面變成了空白一片,listView中的item都消失了。

 

     我在adapterinit(),getView(),getCount()中都寫了Log,發現init()方法中的mData成功獲取了數據,但是getCount方法中顯示item數目為0,而getView中的log更是直接就沒打印出來。一般來說,在一個類中,代碼的執行順序肯定是:變量聲明->構造方法->其他方法,所以init()應該是在getCountgetView之前執行的。現在數據獲取到了,但是卻沒有在布局中顯示出來,慣性思維下,我覺得應該是adapter出現了問題。

 

     我先從adapternotifyDataSetChanged()方法入手,一步步點進去,最后進入notifyChanged()方法,代碼如下:

1 public void notifyChanged(){

2   synchronized(mObservers){

3     //since onChanged() is implemented by the app,it could doanything,including

4     //removing itself from{@link mObservers}-and that could cause problem if

5     //an iterator is used om the ArrayList{link mObservers}.

6      //to avoid such problems,just march thru thelist in the reverse order.

7     for(int i = mObservers.size() - 1;!>=0;i--){

8       mObservers.get(i).onChanged();

9     }  

10  }

11 }

 

從字面上看,就是一個循環,對每一個item進行判斷是否改變,若改變的話對布局進行修改。但現在的問題是getCount0,也就是說并未進行這個循環,通過Log打印的順序,我對getViewLog沒打出來的問題有了大致的猜想:

 

     adapter中方法執行的順序為:構造方法->getCount->getView,其他方法在adapter中并不是必不可少的,暫且不論。當listView綁定了一個adapter時,程序會執行構造方法,然后執行getCount()getCount()會重復執行幾遍,當getCount方法不為0時,執行getView方法。若getCount()一直為0,那么就不執行getView(),布局自然而然就不會顯示出來。

 

     現在的問題就是,數據取到了(mData有數據),但是getCount為什么一直為0呢?我想來想去也只有從第三方類庫SyncHttpClient入手了。在網上查了一下SyncHttpClientAsyncHttpClient的特性,發現字面意思已經表達的很清楚了:sync->同步,async->異步……也就是說,當用AsyncHttpClient時,程序會自動新開一個線程,數據獲取在一個線程,而adapter中的getCount又在另一個線程,兩者的進度是無法把握的。結果很明顯了,雖然是init()方法先執行,但是由于AsyncHttpCilent新開了一個線程,導致在請求參數的過程中,getCount()也已經開始執行,AsyncHttpClient是一個較為耗時的操作,所以每次getCount都先于client.get執行完畢,這就解釋了為什么getCount一直為0mData又不為空了!

 

      既然發現了問題那就很好解決了,最簡單的方法就是把AsyncHttpClient改成SyncHttpClient。但是這樣做性能很差,這就失去了異步操作存在的意義了。我的方法是在AsynHttpClient方法的末尾,即數據取完之后,加一個adapter.notifyDataSetChanged(),這時程序會自動再次執行getCount,很顯然這次的getCount就不為0了,緊接著就執行getView顯示布局,ok,問題解決。當然,開發完APP也是需要進行全方位的檢測:www.ineice.com


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

卓尼县| 留坝县| 广西| 克拉玛依市| 清水县| 延寿县| 板桥市| 会东县| 三河市| 杭州市| 调兵山市| 泉州市| 盈江县| 靖州| 铁力市| 垫江县| 海丰县| 双鸭山市| 尉氏县| 普陀区| 仲巴县| 兴安盟| 西畴县| 即墨市| 双流县| 平凉市| 靖边县| 遵化市| 翼城县| 奉贤区| 凉城县| 绍兴市| 宁南县| 阳春市| 武义县| 攀枝花市| 天长市| 洛阳市| 黄石市| 静乐县| 军事|