通过 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
}