改造 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() {
}
});
我有 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() {
}
});