Rxjava2: использование single & compositedisposable

Фон:

Я пытаюсь загрузить изображение с помощью Glide и rxjava2 (чтобы использовать фоновый поток).

Я все еще не понимаю, как работает каждый компонент rxjava2 api.

Итак, ниже мои вопросы.

Q1: невозможно ли addSingle в CompositeDisposable?

Всякий раз, когда я пытаюсь добавить Single в CompositeDisposable, Android Studio предупреждает меня о несоответствии типов.

Однако, если я позвоню toObservable() перед subscribeOn, сообщение об ошибке исчезнет.

Q2: Исправьте мое использование rxjava2 с Glide, если есть какие-то проблемы.

   private void loadImages(final String imageUri) {
            Single<GlideRequest<Drawable>> glideSingle = Single.fromCallable(
                    new Callable<GlideRequest<Drawable>>() {
                        @Override
                        public GlideRequest<Drawable> call() {
                            return GlideApp.with(MainActivity.this).load(imageUri);
                        }
                    }
            );

            // mSubscription is just new CompositeDisposable()
            mSubscription.add(
                glideSingle
                        .toObservable() // I have to call this to suppress error message
                        .subscribeOn(Schedulers.io())
                        .observeOn(AndroidSchedulers.mainThread())
                        .subscribeWith(
                                new DisposableObserver<GlideRequest<Drawable>>() {
                                    @Override
                                    public void onNext(GlideRequest<Drawable> drawableGlideRequest) {
                                        RequestOptions backgroundTransformOptions = new RequestOptions()
                                                .transforms(
                                                        new CenterCrop(),
                                                        new BlurTransformation(60),
                                                        new ColorFilterTransformation(
                                                                ContextCompat.getColor(MainActivity.this, R.color.colorBackgroundOverlay))
                                                );

                                        drawableGlideRequest
                                                .into(mAlbumArt);

                                        drawableGlideRequest
                                                .apply(backgroundTransformOptions)
                                                .into(mMainBackground);
                                    }

                                    @Override
                                    public void onError(Throwable e) {

                                    }

                                    @Override
                                    public void onComplete() {

                                    }
                                }
                        )
            );
        }

У вас есть поток с Single, поэтому вам нужен его тип потребителя: SingleObserver, из которого JavaDocs явно дает пример с использованием subscribeWith.

akarnokd 10.09.2018 11:02
0
1
1 431
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вместо subscribeWith вы можете использовать обычный метод подписываться.

Это вернет одноразовый объект, например без поддержки лямбда это выглядело бы примерно так:

mSubscription.add(
    glideSingle
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(new Consumer<GlideRequest<Drawable>>() {
            @Override
            public void accept(GlideRequest<Drawable> drawableGlideRequest) throws Exception {

                RequestOptions backgroundTransformOptions = new RequestOptions()
                    .transforms(
                        new CenterCrop(),
                        new BlurTransformation(60),
                        new ColorFilterTransformation(
                            ContextCompat.getColor(MainActivity.this, R.color.colorBackgroundOverlay))
                    );

                drawableGlideRequest
                    .into(mAlbumArt);

                drawableGlideRequest
                    .apply(backgroundTransformOptions)
                    .into(mMainBackground);

            }
        }, new Consumer<Throwable>() {
            @Override
            public void accept(Throwable throwable) throws Exception {

            }
        })
);

Другие вопросы по теме