通过 PublishSubject 在 onNext 中传递 null 并在 RxJava 中过滤该响应
passing null in onNext through PublishSubject and filtering that response in RxJava
我有这样的代码:
getLocationObservable() //this observable returns via PublishSubject the location
.filter(location -> {
.....
Here I want to be able to get a null value for the location
})
.flatMap(location -> anotherObservable()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread()))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe( new Observer<........
位置class是这样的吗:
private PublishSubject<Location> locationPublishSubject = PublishSubject.create();
public Observable<Location> getLocationObservable() {
return locationPublishSubject;
}
and then...
locationPublishSubject.onNext( foundLocation);
现在,getLocationObservable
基于 PublishSubject
,即 returns 通过 onNext
的位置。然后我在 filter
运算符中分析它。但是有时候找不到Location,就传null。但是在 onNext 中传递 null 会导致崩溃。
更具体地说,我得到:UndeliverableException: java.lang.Throwable
如何解决?
Rx 无法与 null
一起使用,最终抛出异常。
您可以在此处使用 Wrapper
模式。
Kotlin 中的示例
class Wrapper<T>(val value: T?)
修改您的主题以发出包裹在包装器中的位置 class。在过滤选项中检查是否包含 null
或不包含,如
.filter{ it.value != null }
Java
中的示例
添加classWrapper
public class Wrapper<T> {
public final T value;
public Wrapper(T value) {
this.value = value;
}
}
然后在发出新位置并过滤它时使用它。
public Observable<Location> getLocationObservable() {
return locationPublishSubject;
}
and then...
locationPublishSubject.onNext(new Wrapper(foundLocation));
.filter(wrapper -> {
wrapper.value != null;
})
或者,如果可能,您可以跳过发射位置 null
。
您可以通过执行以下操作来实现:
我假设您的 foundLocation 变量属于 Location 类型,其中包含 2 个属性 lat 和 lng。
在这种情况下,您可以检查找到的位置是否为空,如果是,则将其替换为具有不可能值的经纬度对象:
if(foundLocation == null) {
foundLocation = new Location(-1000, -1000);
}
locationPublishSubject.onNext( foundLocation);
然后在代码的 onNext 中,您可以检查 lat 和 lng 是否都等于 -1000:
if(foundLocation.getLatitude() == -1000 && foundLocation.getLongitude() == -1000) {
// here you have a null location
}
我有这样的代码:
getLocationObservable() //this observable returns via PublishSubject the location
.filter(location -> {
.....
Here I want to be able to get a null value for the location
})
.flatMap(location -> anotherObservable()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread()))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe( new Observer<........
位置class是这样的吗:
private PublishSubject<Location> locationPublishSubject = PublishSubject.create();
public Observable<Location> getLocationObservable() {
return locationPublishSubject;
}
and then...
locationPublishSubject.onNext( foundLocation);
现在,getLocationObservable
基于 PublishSubject
,即 returns 通过 onNext
的位置。然后我在 filter
运算符中分析它。但是有时候找不到Location,就传null。但是在 onNext 中传递 null 会导致崩溃。
更具体地说,我得到:UndeliverableException: java.lang.Throwable
如何解决?
Rx 无法与 null
一起使用,最终抛出异常。
您可以在此处使用 Wrapper
模式。
Kotlin 中的示例
class Wrapper<T>(val value: T?)
修改您的主题以发出包裹在包装器中的位置 class。在过滤选项中检查是否包含 null
或不包含,如
.filter{ it.value != null }
Java
中的示例添加classWrapper
public class Wrapper<T> {
public final T value;
public Wrapper(T value) {
this.value = value;
}
}
然后在发出新位置并过滤它时使用它。
public Observable<Location> getLocationObservable() {
return locationPublishSubject;
}
and then...
locationPublishSubject.onNext(new Wrapper(foundLocation));
.filter(wrapper -> {
wrapper.value != null;
})
或者,如果可能,您可以跳过发射位置 null
。
您可以通过执行以下操作来实现:
我假设您的 foundLocation 变量属于 Location 类型,其中包含 2 个属性 lat 和 lng。
在这种情况下,您可以检查找到的位置是否为空,如果是,则将其替换为具有不可能值的经纬度对象:
if(foundLocation == null) {
foundLocation = new Location(-1000, -1000);
}
locationPublishSubject.onNext( foundLocation);
然后在代码的 onNext 中,您可以检查 lat 和 lng 是否都等于 -1000:
if(foundLocation.getLatitude() == -1000 && foundLocation.getLongitude() == -1000) {
// here you have a null location
}