gpt4 book ai didi

android - 用 RxJava2 替换 AsyncTaskLoader 的最佳方法是什么?

转载 作者:行者123 更新时间:2023-11-30 00:45:06 26 4
gpt4 key购买 nike

我是 RxJava 的 super 初级,如果我选择了一个糟糕的方法或者有更好的方法,我需要帮助才能找到更好的方法。

我正在处理遗留的 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() {...}
}

所以,我的 Presenter 类正在寻找最新的 Booking 对象,以便将用户引导到下一个屏幕(基于 Booking 的状态)。

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

回到 CurrentBookingLoaderManager,我创建了一个接口(interface)和一些方法,以便以 Rx 方式重构 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. 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)

关于android - 用 RxJava2 替换 AsyncTaskLoader 的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41946103/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com