Итак, у меня есть ConnectableObservable, который получает строки, для каждой из строк мне нужно сделать запрос (асинхронный) и подождать, пока результат не вернется
В настоящее время я использую защелку, чтобы дождаться возвращения запроса, но наблюдаемая ситуация застревает или просто завершает первую строку, а не продолжает другие.
Я выделил проблему в этом примере
private Subscriber<? super String> stringStreamInput;
ConnectableObservable<String> stringStream = Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
stringStreamInput = subscriber;
}
})
.observeOn(Schedulers.io())
.map(new Func1<String, String>() {
@Override
public String call(String perro) {
return getPerroDetails(perro);
}
})
.publish();
stringStream.connect();
Метод, который вызывает симуляцию запроса
private String getPerroDetails(final String perro) {
Log.d("Hey", "Perro " + perro);
//Simulating the query to get Perro details
String newPerro = executeQueryForPerro(perro);
Log.d("Hey", "NewPerro " + newPerro);
return newPerro;
}
Моделирование запроса с использованием CountDownLatch
private String executeQueryForPerro(final String perro) {
final String[] newPerro = new String[1];
final CountDownLatch latch = new CountDownLatch(1);
//SIMULATION OF THE QUERY
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
newPerro[0] = perro + " reloaded ";
latch.countdown();
}
}, 1000);
try {
latch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
return newPerro[0];
}
Test
String[] perros = new String[]{"Beagle", "Alaska", "Chihuahua", "PitBull", "RedBull"};
for (String perro : perros) {
stringStreamInput.onNext(perro);
}
Какие другие подходы я могу использовать, чтобы убедиться, что запрос выполнен правильно и подождать, пока результат вернется, чтобы перейти к следующему шагу?
Есть ли какое-нибудь волшебное решение Rx для этого?
Большое спасибо