Каков наилучший подход замены AsyncTaskLoader на RxJava2?

Я супер младший в RxJava, и мне нужна помощь, чтобы найти лучший подход, если я выбрал плохой подход или есть лучший способ сделать это.

Я работаю над наследством Loader код, и я хочу заменить его на RxJava. В моем исходном коде есть следующее:

public class CurrentBookingLoaderManager extends AsyncTaskLoader<Booking> {
    ...

    @Override
    public Booking loadInBackground() {
        try {
            return createPendingBookingObserver().blockingGet(); // Gets last Booking from back-end
        } catch (Exception e) {
            Logger.logCaughtException(e);
            return loadPendingBookingFromDB();
        }
    }

    private Single<Booking> createPendingBookingObserver() {...}

    private Booking loadPendingBookingFromDB() {...}
}

Итак, класс My Presenter ищет последний объект бронирования, чтобы направить пользователя к следующему экрану (в зависимости от статуса бронирования).

final class Presenter {
    void findLatestBooking() {
        CurrentBookingLoaderManager.newInstance(mContext)
                .getPendingBooking(mActivity, new CurrentBookingLoaderManager.OnPendingBooking() {
                    @Override
                    public void found(Booking booking) {
                        ...
                    }
                });
    }
}

Вернуться к CurrentBookingLoaderManagerЯ создал интерфейс и несколько методов для того, чтобы изменить функциональность loadInBackground() в порядке

    public interface OnPendingBooking {
        void found(Booking booking);
    }

    public void getPendingBooking(final MyActivity activity, final OnPendingBooking callback) {
        CurrentBookingLoaderManager.newInstance(activity)
                .createPendingBookingObserver()
                .compose(activity.<Booking>asyncCallWithinLifecycle())
                .subscribeOn(Schedulers.newThread())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Consumer<Booking>() {
                    @Override
                    public void accept(Booking booking) throws Exception {
                        callback.found(booking);
                    }
                }, new Consumer<Throwable>() {
                    @Override
                    public void accept(Throwable throwable) throws Exception {
                        loadPendingBookingFromDB(activity, callback);
                    }
                });
    }

    private void loadPendingBookingFromDB(final MyActivity activity, final OnPendingBooking callback) {
        Single.fromCallable(new Callable<Booking>() {
            @Override
            public Booking call() throws Exception {
                return loadPendingBookingFromDB();
            }
        })
                .compose(activity.<Booking>asyncCallWithinLifecycle())
                .subscribeOn(Schedulers.newThread())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Consumer<Booking>() {
                    @Override
                    public void accept(Booking booking) throws Exception {
                        callback.found(booking);
                    }
                }, new Consumer<Throwable>() {
                    @Override
                    public void accept(Throwable throwable) throws Exception {
                        callback.found(null);
                    }
                });
    }

Что заставляет меня чувствовать, что это неправильный подход, так это использование множества строк с использованием RxJava, в то время как Rx обычно уменьшает количество строк кода. Поэтому, пожалуйста, дайте мне несколько советов, если вы думаете, что есть лучший способ сделать это.

Этот код отлично работает на основе моих тестов.

1 ответ

  1. RetroLambda
  2. SqlBrite вместо AsyncTaskLoader
  3. По возможности Realm вместо sqlite.
  4. subscribeOn(Schedulers.newThread()) -> subscribeOn(Schedulers.io()) (нет необходимости создавать новую тему каждый раз)
  5. А также

    Observable
    .subscribeOn(Schedulers.newThread())
    .observeOn(AndroidSchedulers.mainThread())
    

Можно заменить на

public class RxUtil {

    public static <T> Observable.Transformer<T, T> applySchedulers() {
        return observable -> observable.subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread());
    }
}

а также

Observable
   .compose(RxUtil::applySchedulers)
Другие вопросы по тегам