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



我正在学习RxJava,我正在转换一个AsyncTask,我必须是一个可观察/订阅者。原来的AsyncTask在后台加载了一个图像,然后在onPostExecute中设置了一个ImageView的可绘制图像。所显示的图像位于循环视图中,当列表滚动时,将为列表中的每个项目加载图像。我把它转换成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);
            });

UI阻塞的原因是just(...)操作符中的表达式在当前线程中执行。

如果你想在subscribeOn(..)中指定的线程中执行表达式,那么你必须使用create(..)方法创建Observable,而不是just(..)方法。

对于你,它看起来像这样:

Observable.create(new Observable.OnSubscribe<Bitmap>(){
        @Override
        public void call(Subscriber<? super Bitmap> subscriber){
            subscriber.onNext(MediaStore.Video.Thumbnails.getThumbnail(context.getContentResolver(),
                    thumbId
                    , MediaStore.Video.Thumbnails.MINI_KIND,
                    null));
            subscriber.onCompleted();
        }
    })
            .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);
                }
            });

相关内容

  • 没有找到相关文章

最新更新