gpt4 book ai didi

android - Android 应用中的 RxJava 和 MVP

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:35:40 28 4
gpt4 key购买 nike

我正在尝试使用 MVP 架构并在 View 端使用 RxJava 和 RxBinding 在 Android 应用程序中实现屏幕。

基本上我有 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 模式中。理想情况下,启用按钮的“业务逻辑”应该在演示者中。实现这一目标的最佳方法是什么?我正在考虑以某种方式将原始观察者传递给演示者(附带问题是如何?),并且演示者将组合这些观察者并且它将具有启用按钮的逻辑。最后,它只会调用 View 来修改按钮状态。

有没有更好的选择?有没有在 View 端使用 RxJava 的 MVP 的好例子?

最佳答案

我的提议:

您走在正确的轨道上。然而 RxBinding 逻辑应该仍然在 View 中。我会将与决定是否启用按钮相关的逻辑移动到演示者中。

从您要检查的所有字段定义一个模型保存值:

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;
}
}

在 View 内部创建一个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传递给presenter:

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();
}
}
});

关于android - Android 应用中的 RxJava 和 MVP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40274583/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com