android - 将图像加载异步任务转换为 rxjava,为什么它滞后于 ui?

标签 android android-asynctask rx-java rx-android

我正在尝试学习 RxJava 并且我正在转换一个 AsyncTask 我必须是一个 Observable/Subscriber。原始的 AsyncTask 在后台加载图像,然后在 onPostExecute 中将 ImageView 的可绘制对象设置为加载的图像。显示的图像在回收 View 中,随着列表滚动,为列表中的每个项目加载图像。我将它转换为 Rx,但现在滚动时有很多延迟。每次在 RecyclerView 的适配器中调用 onBind 时都会调用方法 fetchThumbnail。下面你会看到我原来的实现被注释掉了,还有新的实现。使用 RxJava 时,我发现内存或 CPU 使用率没有显着增加。我相信我也在订阅和观察正确的线程。给了什么?

public class ThumbnailWorker {

    public static void fetchThumbnail(final Context context, final GalleryItem galleryItem, final int thumbId, final ThumnailFetchedListener completionListener) {

        galleryItem.thumbnail.setImageBitmap(null);
        galleryItem.progressBar.setVisibility(View.VISIBLE);

        Observable.just(MediaStore.Video.Thumbnails.getThumbnail(context.getContentResolver(),
                thumbId
                , MediaStore.Video.Thumbnails.MINI_KIND,
                null))
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Action1<Bitmap>() {
                    @Override
                    public void call(Bitmap bitmap) {
                        completionListener.thumbnailFetched(galleryItem, bitmap, thumbId);
                        galleryItem.progressBar.setVisibility(View.GONE);
                    }
                });


//
//        new AsyncTask<Void,Bitmap,Bitmap>() {
//
//
//            @Override
//            protected void onPreExecute() {
//                super.onPreExecute();
//                galleryItem.thumbnail.setImageBitmap(null);
//                galleryItem.progressBar.setVisibility(View.VISIBLE);
//            }
//
//            @Override
//            protected Bitmap doInBackground(Void... params) {
//                Bitmap bitmap = MediaStore.Video.Thumbnails.getThumbnail(context.getContentResolver(),
//                        thumbId
//                        ,MediaStore.Video.Thumbnails.MINI_KIND,
//                        null
//                );
//
//                return bitmap;
//            }
//
//
//            @Override
//            protected void onPostExecute(Bitmap bitmap) {
//                super.onPostExecute(bitmap);
//                completionListener.thumbnailFetched(galleryItem, bitmap,thumbId);
//                galleryItem.progressBar.setVisibility(View.GONE);
//
//            }
//        }.execute();


    }
}

这就是监听器所做的全部。监听器回调适配器。

@Override
public void thumbnailFetched(GalleryItem item, Bitmap thumbnail, int thumbId) {
    if(thumbId == item.id) {
        item.thumbnail.setImageBitmap(thumbnail);
    }
}

最佳答案

Observable.just 可用于已计算的值。

我假设此调用 MediaStore.Video.Thumbnails.getThumbnail(...) 处理您的图像,因此可能滞后于您的 UI。你必须推迟你的电话。为此,您可以使用 Observable.fromCallable :

  Observable.fromCallable(() -> MediaStore.Video.Thumbnails.getThumbnail(context.getContentResolver(), thumbId                 , MediaStore.Video.Thumbnails.MINI_KIND, null))
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(bitmap -> {
                    completionListener.thumbnailFetched(galleryItem, bitmap, thumbId);
                    galleryItem.progressBar.setVisibility(View.GONE);
            });

关于android - 将图像加载异步任务转换为 rxjava,为什么它滞后于 ui?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39385804/

相关文章:

android - MQTT Paho 客户端不会自动重新连接到 Android 服务上的代理

android - 获取 MyFirebaseInstanceIDService 的 Activity 实例

android - 异步任务数据 getter

android - GridView 加载重复的图像和文本(使用 EndlessScrollListener)

java - 无法使用 GsonConverterFactory 在 Retrofit 2.0 中将子类对象转换为请求正文 json

java - 在 Java 中解析格式错误的日期时间字符串

android - 为什么开发人员不直接将参数传递给 setOnCheckedChangeListener

android - 对于 MySQL 请求,是否有比 ASyncTask 更好的类或库?

android - RXJava - 拆分和合并 Observable

java - RxJava : Read from cache until timestamp is expired