Удостоверьтесь, что сетевой вызов выполняется только один раз для каждой кнопки в строке повторного просмотра (RxJava) - PullRequest
0 голосов
/ 27 августа 2018

У меня есть фрагмент, который содержит RecyclerView, который отображает результаты поиска пользователей. Каждая строка пользователя в RecyclerView содержит кнопку Follow / Unfollow, которая при нажатии заставляет фрагмент хоста выполнить соответствующий сетевой вызов в своем Presenter (используя MVP).

Проблема, которую я хочу решить, заключается в том, чтобы убедиться, что если пользователь нажимает на кнопку «следовать / отменить подписку» в данной строке, сетевой вызов выполняется только один раз (я знаю эту конкретную проблему может быть решена с помощью switchmap, если была только одна кнопка). Однако, поскольку в каждой строке есть кнопка, я не хочу, чтобы предыдущие сетевые вызовы отменялись, если, например, пользователь нажимает «Подписаться на одного пользователя», а затем сразу же нажимает «Подписаться» на другого пользователя.

Вот пример того, как выглядит фрагмент:

enter image description here

Буду признателен за любые предложения о том, как этого добиться.

РЕДАКТИРОВАТЬ: забыл упомянуть, что я использую RxJava для работы в сети, и я надеюсь использовать его для решения

Ответы [ 3 ]

0 голосов
/ 27 августа 2018

Вы упомянули switchMap, так что вы, вероятно, собираетесь использовать RxJava для работы в сети, в этом случае я предложу отключить кнопки во время сетевой обработки. В будет выглядеть примерно так:

followButton.clicks()
    .doOnNext { followButton.setEnabled(false) }
    .switchMap( your network Observable or Single)
    .subscribe {
        followButton.setEnable(true);
        followButton.setText("newText");
    }
0 голосов
/ 27 августа 2018

Вы можете отключить кнопку или удалить ее, как только пользователь нажмет кнопку, чтобы они не могли нажать ее несколько раз, а затем повторно показать кнопку в случае сбоя сетевого вызова.

Другим вариантом было бы сделать так, чтобы кнопка отправляла объект в поток и выполняла дубль (1) для этого потока. Затем, если подключение к сети не удается, вы можете создать новый поток нажатий кнопок и подписаться на рассылку.

0 голосов
/ 27 августа 2018

Вам необходимо сохранить состояние каждой строки (например, follow = t / f), а также был ли отправлен запрос на переходное состояние (follow -> not follow и наоборот) (например, transitioning = t / f). Тогда представление должно отражать это состояние, и нажатие на кнопку должно соответственно изменить его (например, make state находится в переходе, только если он еще не переходил)

...