java - 仅当用户不滚动 RecyclerView 时才绑定(bind) ViewHolders

标签 java android performance android-recyclerview

我正在创建一个文件管理器,我想为设备上的视频/图片创建缩略图。但是,当我滚动项目太快时,性能会下降,有时我的应用程序会崩溃,因为一次创建了太多缩略图

我的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 中做到这一点?

最佳答案

问题是,当您滚动回收器时,它会创建许多新线程来尝试加载缩略图。

你应该:

  1. 使用 RxJava 进行缩略图加载任务,可以在 View 滚动且不可见(回收)时处理此加载。

  2. 当您的 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/

相关文章:

android - 如何访问通过 USB 端口连接到 Android 设备的条码扫描器的扫描结果?

c++ - 为什么 Sleep() 会使后续代码减慢 40 毫秒?

Angular: [disabled] ="isDisabled()"是正确的方法吗?

java - AWS java 网络服务器

java - 循环完成的总时间对于每次执行总是不同的

java - Android:是否可以直接从 setOnClickListener() 调用方法?

Java 设计问题 : Enforce method call sequence

android - 模拟谷歌播放应用程序中看到的水平图像列表

android - 使用 SQLCipher 库时出现不满意的链接错误

python - 提高 Python 嵌套 for 循环的性能