検索

ホームページ  >  に質問  >  本文

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条,所以我现在的解决办法并不能彻底解决
烦请老师们给予指点一二,万分感谢!

大家讲道理大家讲道理2828日前810

全員に返信(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 は最後から 2 番目の画像ではなく、最後の画像です

    サーバーからアイテムを取得するロジックをアダプターの getItem に記述することをお勧めします。 リーリー

    返事
    0
  • 阿神

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

    戦略が間違っています。なぜ毎回 5 つの画像 URL しか返されないのでしょうか?通信量を節約するためでしょうか?最大の無駄は、3 ウェイ ハンドシェイクの作成プロセスです。最初にすべての URL を取得してから、画像のキャッシュを自分で制御する必要があります。
    毎回最後から2番目の写真に行って再度リクエストする手間はかかりません...

    返事
    0
  • 伊谢尔伦

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

    質問を見ると、対象者はビューページャのスライディング リスニング メソッドでネットワーク リクエストを行っています。
    ユーザーがビューページャを左右にすばやくスライドすると、コールバックが複数回実行される可能性があります。
    前のネットワーク リクエストはまだ進行中であるため、次のリクエストはクラッシュします。
    これが理由の場合は、現在のリクエストが進行中の場合、正しいまたはエラーのコールバックが受信されるまで新しいネットワーク リクエストは行われないようにフラグを追加できます。
    返品されるアイテムの数が固定されているという問題に関しては、5 枚の写真をリクエストしたのにサーバーが 3 枚だけを返した場合、サーバーはすべての写真を提供したことを意味し、ネットワーク リクエストは実行されるべきではありません

    返事
    0
  • キャンセル返事