每个ListItem有两个请求在RecyclerView中加载图像

时间:2016-05-10 13:36:42

标签: android image android-recyclerview retrofit spotify

我有一个带艺术家的RecyclerView.Adapter。我使用艺术家的名字在Spotify(https://developer.spotify.com/web-api/search-item/)上查找,以获得每位艺术家的缩略图。然后我使用缩略图的URL来获取图像。目前我正在使用Glide进行ImageLoading和Caching。

问题在于,当我快速滚动时,它是滞后的,过了一会儿,它会因OutOfMemoryError而崩溃:

java.lang.OutOfMemoryError: Could not allocate JNI Env
                                                             at java.lang.Thread.nativeCreate(Native Method)
                                                             at java.lang.Thread.start(Thread.java:1063)
                                                             at java.util.concurrent.ThreadPoolExecutor.addWorker(ThreadPoolExecutor.java:921)
                                                             at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1339)
                                                             at okhttp3.Dispatcher.enqueue(Dispatcher.java:112)
                                                             at okhttp3.RealCall.enqueue(RealCall.java:78)
                                                             at okhttp3.RealCall.enqueue(RealCall.java:70)
                                                             at retrofit2.OkHttpCall.enqueue(OkHttpCall.java:101)
                                                             at retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall.enqueue(ExecutorCallAdapterFactory.java:60)
                                                             at at.audiocracy.adapter.ArtistAdapter.fetchArtistImage(ArtistAdapter.java:79)

到目前为止我的优化:

  • 为ArrayList中的每位艺术家保存Spotify-Url,以防止第二次查找艺术家
  • 向每个ViewHolder添加改装调用,如果ViewHolder被回收,则取消请求

我的问题是 - 如何防止它崩溃?如何以滚动流畅的方式优化我的适配器?如何最好地缓存这些缩略图?

1 个答案:

答案 0 :(得分:1)

由于内存使用过多,你会遇到内存不足的问题。您可以执行以下操作的非详尽列表如下:

  • 请勿将完整图像加载到内存中。
  • 如果可能,请重复使用位图。
  • 确保位图不会被不必要地保留在内存中(在ListViewRecyclerView中容易意外)。
  • 使用某种形式的caching
  • 图像处理是否脱离主线程。

这可以在android docs中看到。如果你花了很长时间,你可以想出一个很好的解决方案。但是对于回收者视图,您可能会遇到一些边缘情况。

最终,使用库有效加载图像更有意义,因此您不必担心这一点。 PicassoUniversal Image Loader是最受欢迎的。不要重新发明轮子。这些图书馆有很多工作要做。利用这个。

编辑:

看来你正在使用一个很棒的库。我注意到他们有一个Loading and Caching on Background Threads部分。如果你还没有,请利用它。只需使用配置,确保您没有做不必要的工作。