将图像加载asynctask转换为rxjava,为什么它会滞后于ui?

Tyl*_*aff 2 android android-asynctask rx-java rx-android

我正在尝试学习RxJava,我正在转换AsyncTask我必须是一个Observable/Subscriber.原始AsyncTask图像在后台加载,然后将ImageView的drawable设置为加载的图像onPostExecute.显示的图像位于recyclerview中,当列表滚动时,将为列表中的每个项目加载图像.我将它转换为Rx,但现在滚动时存在很多延迟.fetchThumbnail每次onBind调用该方法都在RecyclerView的适配器中调用.下面您将看到我的原始实现已注释掉,以及新的实现.我发现使用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();


    }
}
Run Code Online (Sandbox Code Playgroud)

这就是听众正在做的事情.侦听器回调适配器.

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

dwu*_*sen 5

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);
            });
Run Code Online (Sandbox Code Playgroud)