Как переключить карту после нажатия кнопки RxJava2 - PullRequest
0 голосов
/ 05 июня 2018

изучаю switchMap.Случай таков: 1) Пользователь нажимает кнопку 1 2) Просматривает вызовы метода Presenter getRecord (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 Ответ

0 голосов
/ 05 июня 2018

Я предлагаю иметь нажатие кнопок в виде потока, равного 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))
        ....
}
...