2016-12-28 4 views
0

Следующий код испускает элементы из списка, используя Observable.from(). С каждым элементом, flatMap() с максимальным значением тока 1 выполняется с помощью Observable от devide.connectForPolice(). Метод device.connectForPolice() выполняет ряд операций над текущим элементом и в конечном итоге вызывает Observable.just(), чтобы перейти к следующему элементу. Вот код:Формирование onNext() при нажатии кнопки

mConnectingSubscription = Observable.from(mAdapter.getItems()) 
       .flatMap(device -> { 
        return device.connectForPolice(device.getName()); 
       }, 1) 
       .observeOn(AndroidSchedulers.mainThread()) 
       .subscribe(new Subscriber<String>() { 
        @Override 
        public void onCompleted() {} 

        @Override 
        public void onError(Throwable e) {} 

        @Override 
        public void onNext(String s) { 
         if (s.contains("str")) { 
          mAdapter.removeItem(s); 
         } 
        } 
       }); 

Я буду добавлять кнопки на экран, когда этот код начинает работать, и на клик Я хотел бы «сила» текущий элемент из исходного Observable.from(mAdapter.getItems()) завершить поэтому следующие элемент в списке может проходить через цепочку. Это по сути кнопка «пропустить» или «завершить». Каков наилучший способ интегрировать это в эту цепочку событий?

ответ

0

Это зависит от конкретного поведения, которое вы хотите достичь. Если этого достаточно, чтобы просто проигнорировать результат device.connectForPolice(device.getName()), тогда решение тривиально. Просто объедините этот поток с другим, который представляет клики на этой кнопке пропуска и возьмет только 1 элемент, в зависимости от того, что наступит раньше.

.flatMap(device -> { 
    return device.connectForPolice(device.getName()) 
       .mergeWith(RxView.clicks(skipBtn).map(voidObject -> someString)) 
       .take(1); 
}, 1) 

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