Android 应用中的 RxJava 和 MVP
RxJava and MVP in Android app
我正在尝试在 Android 应用程序中使用 MVP 架构并在视图端使用 RxJava 和 RxBinding 来实现屏幕。
基本上我有 2 个 Spinners、1 个 TextEdit 和一个默认禁用的按钮。当 Spinners 选择了项目并且文本字段不为空时,我想启用该按钮。这是代码:
Observable.combineLatest(
RxAdapterView.itemSelections(mFirstSpinner),
RxAdapterView.itemSelections(mSecondSpinner),
RxTextView.textChanges(mEditText),
new Func3<Integer, Integer, CharSequence, Boolean>() {
@Override
public Boolean call(Integer first, Integer second, CharSequence value) {
return !TextUtils.isEmpty(value);
}
}).subscribe(new Action1<Boolean>() {
@Override
public void call(Boolean enable) {
mButton.setEnabled(enable);
}
});
现在的问题是如何将其集成到 MVP 模式中。理想情况下,启用按钮的 "business logic" 应该在演示者中。实现这一目标的最佳方法是什么?我正在考虑以某种方式将原始观察者传递给演示者(附带问题是如何?),并且演示者将组合这些观察者并且它将具有启用按钮的逻辑。最后,它只是调用视图来修改按钮状态。
有没有更好的选择?在 View 端使用 RxJava 的 MVP 有什么好的例子吗?
我的主张:
你走在正确的轨道上。但是 RxBinding
逻辑仍应在视图中。我会将与决定是否启用按钮相关的逻辑移动到演示者中。
定义一个模型,保存您要检查的所有字段的值:
private class ViewValuesModel {
public Integer adapter1Value;
public Integer adapter2Value;
public CharSequence textValue;
public ViewValuesModel(Integer adapter1Value, Integer adapter2Value, CharSequence textValue) {
this.adapter1Value = adapter1Value;
this.adapter2Value = adapter2Value;
this.textValue = textValue;
}
}
在视图内部创建一个 Observable
:
Observable observable = Observable.combineLatest(
RxAdapterView.itemSelections(mFirstSpinner),
RxAdapterView.itemSelections(mSecondSpinner),
RxTextView.textChanges(mEditText),
new Func3<Integer, Integer, CharSequence, ViewValuesModel>() {
@Override
public ViewValuesModel call(Integer first, Integer second, CharSequence value) {
return new ViewValuesModel(first, second, value);
}
}
)
然后将此 Observable
传递给演示者:
mPresenter.observeChoosableFieldChanges(observable).
主持人内部完成剩下的工作:
observable
.map(new Func1<ViewValuesModel, Boolean>() {
@Override
public Booleancall(ViewValuesModel viewStates) {
return !TextUtils.isEmpty(viewStates.textValue);
}
})
.subscribe(new Action1<Boolean>() {
@Override
public void call(Boolean enable) {
if (enable) {
view.enableButton();
}
}
});
您可以枚举您的来源并将 Pair 值事件传递给 Subject/Processor,您可以在其中执行是否启用按钮和 post 布尔事件的逻辑。更新演示者按钮的人将订阅此 Subject/Processor。
像这样,您可以灵活地更改源和逻辑,而无需更改 Presenter-View 协定。
Presenter 中基本上可以有 2 个完全分离的组件:
1) 侦听传入视图事件并生成动作流以启用或禁用按钮的组件
2) 监听 enable/disable 动作并分别更新视图的组件(这也可以通过 Google 的绑定库实现)
通过这种方式,您可以启用多个解耦的交互链,并且由于组件的琐碎性和流连接的清晰性而易于维护。
你也可以使用类似 RHub library. You can find components example here
我正在尝试在 Android 应用程序中使用 MVP 架构并在视图端使用 RxJava 和 RxBinding 来实现屏幕。
基本上我有 2 个 Spinners、1 个 TextEdit 和一个默认禁用的按钮。当 Spinners 选择了项目并且文本字段不为空时,我想启用该按钮。这是代码:
Observable.combineLatest(
RxAdapterView.itemSelections(mFirstSpinner),
RxAdapterView.itemSelections(mSecondSpinner),
RxTextView.textChanges(mEditText),
new Func3<Integer, Integer, CharSequence, Boolean>() {
@Override
public Boolean call(Integer first, Integer second, CharSequence value) {
return !TextUtils.isEmpty(value);
}
}).subscribe(new Action1<Boolean>() {
@Override
public void call(Boolean enable) {
mButton.setEnabled(enable);
}
});
现在的问题是如何将其集成到 MVP 模式中。理想情况下,启用按钮的 "business logic" 应该在演示者中。实现这一目标的最佳方法是什么?我正在考虑以某种方式将原始观察者传递给演示者(附带问题是如何?),并且演示者将组合这些观察者并且它将具有启用按钮的逻辑。最后,它只是调用视图来修改按钮状态。
有没有更好的选择?在 View 端使用 RxJava 的 MVP 有什么好的例子吗?
我的主张:
你走在正确的轨道上。但是 RxBinding
逻辑仍应在视图中。我会将与决定是否启用按钮相关的逻辑移动到演示者中。
定义一个模型,保存您要检查的所有字段的值:
private class ViewValuesModel {
public Integer adapter1Value;
public Integer adapter2Value;
public CharSequence textValue;
public ViewValuesModel(Integer adapter1Value, Integer adapter2Value, CharSequence textValue) {
this.adapter1Value = adapter1Value;
this.adapter2Value = adapter2Value;
this.textValue = textValue;
}
}
在视图内部创建一个 Observable
:
Observable observable = Observable.combineLatest(
RxAdapterView.itemSelections(mFirstSpinner),
RxAdapterView.itemSelections(mSecondSpinner),
RxTextView.textChanges(mEditText),
new Func3<Integer, Integer, CharSequence, ViewValuesModel>() {
@Override
public ViewValuesModel call(Integer first, Integer second, CharSequence value) {
return new ViewValuesModel(first, second, value);
}
}
)
然后将此 Observable
传递给演示者:
mPresenter.observeChoosableFieldChanges(observable).
主持人内部完成剩下的工作:
observable
.map(new Func1<ViewValuesModel, Boolean>() {
@Override
public Booleancall(ViewValuesModel viewStates) {
return !TextUtils.isEmpty(viewStates.textValue);
}
})
.subscribe(new Action1<Boolean>() {
@Override
public void call(Boolean enable) {
if (enable) {
view.enableButton();
}
}
});
您可以枚举您的来源并将 Pair 值事件传递给 Subject/Processor,您可以在其中执行是否启用按钮和 post 布尔事件的逻辑。更新演示者按钮的人将订阅此 Subject/Processor。
像这样,您可以灵活地更改源和逻辑,而无需更改 Presenter-View 协定。
Presenter 中基本上可以有 2 个完全分离的组件:
1) 侦听传入视图事件并生成动作流以启用或禁用按钮的组件 2) 监听 enable/disable 动作并分别更新视图的组件(这也可以通过 Google 的绑定库实现)
通过这种方式,您可以启用多个解耦的交互链,并且由于组件的琐碎性和流连接的清晰性而易于维护。
你也可以使用类似 RHub library. You can find components example here