Je suis super junior dans RxJava et j'ai besoin d'aide pour trouver une meilleure approche si j'ai choisi une mauvaise approche ou s'il y a une meilleure façon de faire.Quelle est la meilleure approche de remplacement de AsyncTaskLoader par RxJava2?
Je travaille sur un ancien code Loader
et je veux le remplacer par RxJava. Je suit Dans mon code d'origine:
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() {...}
}
Alors, Ma classe Présentateur recherche dernier objet de réservation afin de l'utilisateur directement à l'écran suivant (en fonction du statut de la réservation).
final class Presenter {
void findLatestBooking() {
CurrentBookingLoaderManager.newInstance(mContext)
.getPendingBooking(mActivity, new CurrentBookingLoaderManager.OnPendingBooking() {
@Override
public void found(Booking booking) {
...
}
});
}
}
Retour à CurrentBookingLoaderManager
, je crée une interface et quelques méthodes pour factoriser la fonctionnalité de loadInBackground()
de manière Rx.
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);
}
});
}
Ce qui me fait sentir ce n'est pas la bonne approche est d'avoir beaucoup de lignes en utilisant RxJava tandis que Rx réduit normalement nombre de lignes de code. Alors, s'il vous plaît, donnez-moi un point si vous pensez qu'il y a une meilleure façon de le faire.
Ce code fonctionne très bien selon mes tests. Merci
Rxjava 1 ou 2? il y a une petite différence de classes dans les deux. – Saurabh
@Saurabh RxJava 2 en fait, merci de demander :) Je viens de mettre à jour ma question. – Hesam
la seule chose que vous pourriez améliorer est d'utiliser 'subscribeOn (Schedulers.io())', au lieu de créer un nouveau thread à chaque fois. le repos me va bien. :) – Saurabh