在listView中点击例如“美女图片”后打开一个largeActivity;
largeActivity中有一个viewPager实现左右滑动浏览大图;
在largeActivity打开的时候会通过okHttp从服务器请求一组5张图片链接,图片通过glide加载在viewPager中实现左右滑动浏览;
因为每次网络请求只能返回5张图片链接,所以我在监听每次滑动viewPager的时候判断当前 postion小于存储图片链接的imageList.size() -1的时候,也就是每次滑动到倒数第二张的时候去网络请求下一组图片的链接;
然后通过add将新请求到的图片链接添加进imageList,然后再执行一次
pagerAdapter.notifyDataSetChanged()来实现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条,所以我现在的解决办法并不能彻底解决
烦请老师们给予指点一二,万分感谢!
これはスレッドの安全性の問題であると大胆に推測します。新しいデータを取得するときは、
post
メソッド、つまりviewPager.post()
を使用して、notifyDataSetChanged
タスクに移動します。まだ個人的に検証していないので、うまくいかない場合は教えてください。確認してみます。post
当面は、具体的なエラーの原因を特定することはできません。同じ効果を達成するために、RecycleView を使用してみることもできます。
私の理解が間違っていたかどうかはわかりませんが、images.size()-1 は最後から 2 番目の画像ではなく、最後の画像です
サーバーからアイテムを取得するロジックをアダプターの getItem に記述することをお勧めします。 リーリー
戦略が間違っています。なぜ毎回 5 つの画像 URL しか返されないのでしょうか?通信量を節約するためでしょうか?最大の無駄は、3 ウェイ ハンドシェイクの作成プロセスです。最初にすべての URL を取得してから、画像のキャッシュを自分で制御する必要があります。
毎回最後から2番目の写真に行って再度リクエストする手間はかかりません...
質問を見ると、対象者はビューページャのスライディング リスニング メソッドでネットワーク リクエストを行っています。
ユーザーがビューページャを左右にすばやくスライドすると、コールバックが複数回実行される可能性があります。
前のネットワーク リクエストはまだ進行中であるため、次のリクエストはクラッシュします。
これが理由の場合は、現在のリクエストが進行中の場合、正しいまたはエラーのコールバックが受信されるまで新しいネットワーク リクエストは行われないようにフラグを追加できます。
返品されるアイテムの数が固定されているという問題に関しては、5 枚の写真をリクエストしたのにサーバーが 3 枚だけを返した場合、サーバーはすべての写真を提供したことを意味し、ネットワーク リクエストは実行されるべきではありません