android - 按下按钮RxJava2后如何切换 map

标签 android rx-java2 mvp rx-binding

我研究 switchMap。 案例是: 1) 用户按下按钮 1 2)View调用Presenter方法getRecord(id),并发送按钮id。 3) Presenter 订阅 observable 并发出数据 4) 用户按下按钮 2 5) Presenter 取消订阅当前订阅并创建新订阅。

我知道我必须使用 switchMap 运算符。 我想在日志中看到:Obs1: 0, Obs1: 1, Obs1: 2(click) Obs2: 0, Obs2: 1 .... 这是我的代码 查看:

    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mPresenter = new Presenter();
    Button button1 = findViewById(R.id.btn_1);
    Button button2 = findViewById(R.id.btn_2);


    button1.setOnClickListener(v -> {
        mPresenter.getRecord(1);
    });

    button2.setOnClickListener(v -> {
        mPresenter.getRecord(2);
    });

主持人:

public class Presenter {
    private final String TAG = this.getClass().getSimpleName();

    int ID = 0;
    Observable observable = Observable.just(ID);

    public void getRecord(int id) {
        observable
                .doOnNext(data -> Log.d(TAG, String.valueOf(data)))
                .switchMap(s -> getObservable(id))
                .subscribe(data -> Log.d(TAG, (String) data));
    }

    Observable<String> getObservable(int id) {
        return Observable.interval(1, TimeUnit.SECONDS)
                .map(data -> "Obs" + String.valueOf(id) + ":" + data);
    }
}


Here is my LOG:
    D/Presenter: 0
    D/Presenter: Obs1:0
    D/Presenter: Obs1:1
    D/Presenter: Obs1:2
    D/Presenter: Obs1:3
    D/Presenter: Obs1:4
    D/Presenter: Obs1:5
    D/Presenter: 0
    D/Presenter: Obs1:6
                 Obs2:0
    D/Presenter: Obs1:7
    D/Presenter: Obs2:1
    D/Presenter: Obs1:8
    D/Presenter: Obs2:2
    D/Presenter: Obs1:9
    D/Presenter: Obs2:3
    D/Presenter: Obs1:10
    D/Presenter: Obs2:4

最佳答案

我建议将按钮点击作为一些 UiEvent 的流,在演示器中合并两个按钮流,switchMap 将按预期工作。

伪代码

Observable<UiEvent> getButton1ClickEvents(){
    return RxView.clicks(button1)
          .map(new Button1ClickEvent());
}
Observable<UiEvent> getButton2ClickEvents(){
    return RxView.clicks(button2)
          .map(new Button2ClickEvent());
}

void getRecord(){
    Observable.merge(getButton1ClickEvents(),getButton2ClickEvents())
        .switchMap(event -> getObservable(id))
        ....
}

关于android - 按下按钮RxJava2后如何切换 map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50695250/

相关文章:

使用 Rx-Java 时,旋转后 Android View 为空

asp.net - 限制违反架构 - asp.net MVP

java - MVP:Presenter Singleton

Android Room数据库 View

android - 使用 RxJava 将列表转换为另一个列表

android - 在android中添加自定义单选按钮

java - RxJava onError 回调中未捕获 InterruptedException?

android - MVP架构与Android中的Rx Observables混合在一起?

android - 无法将 OnCheckedChangeListener 设置为复选框

android - 如何将数据添加到 listView 的自定义 BaseAdapter - Android