使用RxJava2 PublishSubject管理null布尔值

时间:2017-06-23 12:00:18

标签: android mvp rx-java2

我正在实施MVP设计模式。我的演示者从视图中接收新值。我希望通过在视图上更新值时自动检查一切是否有效来管理下一个按钮的状态。

在我的表单中,我有一个可选部分,只有在用户选择了正确的选项时才会显示。 在这个可选部分中,我有一个二元问题。如果未显示该部分,我需要在Presenter端将问题的值设置为null。 例如,用户选择该选项并显示可选部分。用户选择答案。然后,用户更改选项,隐藏可选部分。在这种情况下,我需要将可选问题的答案设置为null,因为如果用户再次显示可选部分,则答案尚未被选中。

为此,我在Presenter上使用空值而不是true / false调用方法。

以下是代码:

private final PublishSubject<Boolean> mObsOptionalAnswer = PublishSubject.create();

public MyPresenter(){
    // Combine all the values together to enable/disable the next button
    Observable.combineLatest(
        // ... other fields
        // I need this to return false if the optional part is 
        // displayed but nothing is selected
        mObsOptionalAnswer.map(this::isValid),
        (...) -> ...
    ).subscrible(enable ->{
        mView.enableBtn(enable);
    });     
}

public void myFunction(Boolean isSomething){
    // ... some code
    mObsOptionalAnswer.onNext(isSomething);
}

private boolean isValid(Boolean value){
    return value != null;
}

问题是,由于RxJava 2,null方法中不允许onNext()值。 那么,我该如何管理呢?

2 个答案:

答案 0 :(得分:1)

你可以使用constante布尔对象

 public static final Boolean RESET_VALUE = new Boolean(false);

你可以emit而不是发出null。接收方必须检查此实例并相应地执行操作。例如

.subscrible(enable ->{
    if (enable != RESET_VALUE) {
        mView.enableBtn(enable);
    } 
});

答案 1 :(得分:1)

如果您希望能够发送空值,则可以使用包装器。在此配置中,您发送包装器,即使该值本身也不为空。

public class BooleanWrapper {

    public final Boolean value;

    public BooleanWrapper(Boolean value) {
        this.value = value;
    }
}

您的PublishSubject<Boolean>变为PublishSubject<BooleanWrapper>,您只需创建包装器并在需要时取消引用布尔值:

mObsOptionalAnswer.onNext(new BooleanWrapper(isSomething));

mObsOptionalAnswer.map(wrapper -> this.isValid(wrapper.value))

如果您需要在代码中多次执行此操作,则可以创建通用包装器(如this tutorial所述):

public class Optional<M> {

    private final M optional;

    public Optional(@Nullable M optional) {
        this.optional = optional;
    }

    public boolean isEmpty() {
        return this.optional == null;
    }

    public M get() {
        return optional;
    }
}