我有一个带艺术家的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)
到目前为止我的优化:
我的问题是 - 如何防止它崩溃?如何以滚动流畅的方式优化我的适配器?如何最好地缓存这些缩略图?
答案 0 :(得分:1)
由于内存使用过多,你会遇到内存不足的问题。您可以执行以下操作的非详尽列表如下:
ListView
或RecyclerView
中容易意外)。这可以在android docs中看到。如果你花了很长时间,你可以想出一个很好的解决方案。但是对于回收者视图,您可能会遇到一些边缘情况。
最终,使用库有效加载图像更有意义,因此您不必担心这一点。 Picasso和Universal Image Loader是最受欢迎的。不要重新发明轮子。这些图书馆有很多工作要做。利用这个。
编辑:
看来你正在使用一个很棒的库。我注意到他们有一个Loading and Caching on Background Threads部分。如果你还没有,请利用它。只需使用配置,确保您没有做不必要的工作。