代码之家  ›  专栏  ›  技术社区  ›  Masquitos

如何在按下按钮rxjava2后切换地图

  •  1
  • Masquitos  · 技术社区  · 8 年前

    我学习switchmap。 案例是: 1)用户按下按钮1 2)view调用presenter方法getrecord(id)和send按钮id。 3)演示者订阅可观察到的和发出的数据 4)用户按下按钮2 5)演示者取消当前订阅并创建新订阅。

    我知道我必须使用switchmap运算符。 我想在日志中看到这个:obs1:0,obs1:1,obs1:2(单击)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
    
    1 回复  |  直到 8 年前
        1
  •  1
  •   Tuby    8 年前

    我建议按一下按钮 UiEvent ,合并Presenter和 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))
            ....
    }