改造 Rx Java 请求

Retrofit Rx Java Requests

我有 2 个表 TimeStamps 和 Infraction,我想做 类似使用 Rx Android 进行改造的东西:

     Request-> I get TimeStamps (if it's changed)
   -> I send new request to get Infractions 
      else I display infractions from database

这是我使用 Retrofit 所做的,对吗??

Observable<TimeStamps> callTimeStamp = apiInterface.getTimeStamp();
       TimeStamps stamps = realm.where(TimeStamps.class).findFirst();

       callTimeStamp.flatMap(new Function<TimeStamps, ObservableSource<List<Infraction>>>() {
           @Override
           public ObservableSource<List<Infraction>> apply(TimeStamps timeStamps) throws Exception {

         if(!timeStamps.getInfractionTimeStamps().equalsIgnoreCase( stamps.getInfractionTimeStamps()))
               return apiInterface.getInfractions();
         else
             return null;
           }
       }).subscribeOn(Schedulers.newThread())
               .observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer<List<Infraction>>() {
           @Override
           public void onSubscribe(Disposable d) {

           }

           @Override
           public void onNext(List<Infraction> infractions) {

           }

           @Override
           public void onError(Throwable e) {

           }

           @Override
           public void onComplete() {

           }
       });

没有

TimeStamps stamps = realm.where(TimeStamps.class).findFirst();

这在当前线程

上获取stamps

if(!timeStamps.getInfractionTimeStamps().equalsIgnoreCase( stamps.getInfractionTimeStamps()))

这会尝试在不同的线程上访问那个 stamps 实例,所以你会得到一个 IllegalStateException

return null;

即使它确实有效,这一行也会使 RxJava2 抛出 NullPointerException

.subscribeOn(Schedulers.newThread())

这可以很容易地改为 Schedulers.io(),这样它就不会创建太多线程(当然你应该确保使用 try(Realm realm = ...)finally { realm.close() }

.subscribe(new Observer>() {

这是错误的,除非你 "properly implement onSubscribe" 这根本不是预期的,这应该是 new DisposableObserver<List<Infraction>>().

在这种情况下,您的 Retrofit 界面可能应该公开 Single<T>,因为单身人士在完成后会自动退订。


Single<TimeStamps> callTimeStamp = apiInterface.getTimeStamp();

   callTimeStamp.flatMap((timeStamps) -> {
        try(Realm realm = Realm.getDefaultInstance()) {
            TimeStamps stamps = realm.where(TimeStamps.class).findFirst();
            if(!timeStamps.getInfractionTimeStamps().equalsIgnoreCase( stamps.getInfractionTimeStamps()))
                return apiInterface.getInfractions();
            else
                return Single.never();
       }
   }).subscribeOn(Schedulers.io())
     .observeOn(AndroidSchedulers.mainThread())
     .subscribe(new DisposableObserver<List<Infraction>>() {
       @Override
       public void onNext(List<Infraction> infractions) {

       }

       @Override
       public void onError(Throwable e) {

       }

       @Override
       public void onComplete() {

       }
   });