我正在创建一个文件管理器,我想为设备上的视频/图片创建缩略图。但是,当我滚动项目太快时,性能会下降,有时我的应用程序会崩溃,因为一次创建了太多缩略图
我的ViewHolder
的主要BIND部分:
new Thread(new Runnable() {
@Override
public void run() {
final Bitmap[] btm = {null};
if(mimeType.startsWith("video/") || mimeType.startsWith("image/")){
if(mimeType.startsWith("video/")){
btm[0] = ThumbnailsHelper.createThumbForVideo(file.getAbsolutePath());
}else if(mimeType.startsWith("image/")){
btm[0] = ThumbnailsHelper.createThumbForPic(file.getAbsolutePath());
}
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
mFileIcon.setImageBitmap(btm[0]);
}
});
}
}
}).start();
我的RecyclerView
设置:
mRecyclerView.setItemViewCacheSize(20);
mRecyclerView.setDrawingCacheEnabled(true);
mRecyclerView.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);
在 ZArchiver 或类似应用程序中,我发现只有当用户不滚动 RecyclerView
项目时才会显示缩略图。那么,我怎样才能改善这种情况,也许有人知道如何在 ZArchiver 中做到这一点?
最佳答案
问题是,当您滚动回收器时,它会创建许多新线程来尝试加载缩略图。
你应该:
使用 RxJava 进行缩略图加载任务,可以在 View 滚动且不可见(回收)时处理此加载。
当您的 View 被回收(onViewRecycled() 方法。请参阅: https://developer.android.com/reference/android/support/v7/widget/RecyclerView.Adapter )时,您应该处理此网络请求。
另一种解决方法是为每个视频创建缩略图作为 gif 图像,将其存储在服务器上,然后使用 Glide 显示(请参阅: Show GIF file with Glide (image loading and caching library) 和 https://biteable.com/blog/tips/make-gif-video/ )
关于java - 仅当用户不滚动 RecyclerView 时才绑定(bind) ViewHolders,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57451194/