搜尋

首頁  >  問答  >  主體

android - viewPager滑动浏览一组大图,滑动倒数第二张时请求新数据追加数据……

现在问题是如果用户以正常速度滑动viewPager来浏览每张图片的时候是没有任何问题的,但是如果用户飞速滑动viewPager的进行浏览的时候就会出现在某一次请求新数据后就会出现APP崩溃的情况;错误信息在两部不同的手机上报错不一样,但是都是在相同的情况下崩溃。Google遍都没有找到解决办法

华为荣耀报错如下:

通过华为手机的报错在网上找到通过设置 android:hardwareAccelerated="false"
来关闭硬件加速的办法,但是通过测试在快速滑动时还是会导致APP崩溃自动重启的情况

乐视max2报错如下:

03-21 05:42:44.071 18730-18730/com.abcd.reader.abcdreader E/InputEventReceiver: Exception dispatching input event.
03-21 05:42:44.071 18730-18730/com.abcd.reader.abcdreader E/MessageQueue-JNI: Exception in MessageQueue callback: handleReceiveCallback
03-21 05:42:44.084 18730-18730/com.abcd.reader.abcdreader E/MessageQueue-JNI: java.lang.IllegalStateException: The application's PagerAdapter changed the adapter's contents without calling PagerAdapter#notifyDataSetChanged! Expected adapter item count: 25, found: 30 Pager id: com.abcd.reader.abcdreader:id/vp_pager Pager class: class android.support.v4.view.ViewPager Problematic adapter: class com.abcd.reader.abcdreader.adapter.FollowDetailViewPagerAdapter

通过乐视手机的报错怀疑是当新请求的数据add进imageList后,但是还没来得及执行notifyDataSetChanged,刚好在这时用户在滑动viewPager的时候导致的;为了验证猜测我修改了在当前 postion小于存储图片链接的imageList.size() -2的时候,也就是每次滑动到倒数第三张的时候去网络请求下一组图片的链接;给imageList.add和notifyDataSetChanged预留了充分的执行时间,这时候再次测试问题消失,华为手机和乐视手机均没有再出现APP崩溃重启的情况


但是我这个服务器请求回来的数据是不固定的,有时候可能每次返回5条,有时候10条,有时候只有1条,所以我现在的解决办法并不能彻底解决
烦请老师们给予指点一二,万分感谢!

大家讲道理大家讲道理2767 天前769

全部回覆(5)我來回復

  • PHPz

    PHPz2017-04-18 09:18:18

    大膽估計一下應該是線程安全問題,可以嘗試以下修改,取得新資料時,使用post方法去做更新,即
    viewPager.post()notifyDataSetChanged放到post任務裡去。還沒親自驗證,如果不可以,也麻煩你告訴我一聲,我再看看。

    回覆
    0
  • PHPz

    PHPz2017-04-18 09:18:18

    具體錯誤原因我暫時無法幫你定位,我給你另一個實現的思路,可以嘗試使用RecycleView來實現同樣的效果。

    回覆
    0
  • 黄舟

    黄舟2017-04-18 09:18:18

    不知道是不是我理解錯了,但images.size()-1不是倒數第二張,而是最後一張

    建議把從伺服器拉取條目的邏輯寫到Adapter的getItem;

     @Override
            public Fragment getItem(int position) {
                if(getCount()-1 == position){
                    //在此处拉取
                }
                return ArrayListFragment.newInstance(position);
            }

    回覆
    0
  • 阿神

    阿神2017-04-18 09:18:18

    策略就錯了,每次只回傳5個image的url是為什麼?難道是為了節省流量嗎?最大的浪費是三次握手的創作過程,上來就應該拿到所有的url,然後自己控制圖片快取。
    你每次到倒數第二張再去請求,也不怕麻煩.....

    回覆
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-18 09:18:18

    看問題,題主是在viewpager滑動監聽的方法裡面做網絡請求,
    如果使用者快速左右滑動viewpager,很可能多次執行該回調。
    而之前的網路請求還在進行中,再次請求也就崩潰了。
    如果是這個原因造成的話,你可以增加一個標記,如果當前請求正在進行中,在沒有得到正確或錯誤的回調前,不再進行新的網絡請求。
    至於返回不條目數不固定的問題,如果你請求5張圖片,伺服器只回傳3張,表示伺服器圖片已經全給你了,你的網路請求也就不要執行了

    回覆
    0
  • 取消回覆