Как создать Observables и обновить их с помощью Retrofit позже RxJava? - PullRequest
0 голосов
/ 28 февраля 2019

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

Проблема в том, что мне нужно изначально создать Observables, добавить их в список и использовать оператор zip.Только позже я выполняю сетевой запрос с помощью Retrofit, и мне нужно обновить значение наблюдаемого в списке, чтобы работал весь мой zip-оператор.

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

 List<Observable<Object>> listObservables = new ArrayList<>();
    //Adding initial request
    Observable<Object> testObservable = RetrofitFactory.create().startProcess();
    listObservables.add(testObservable);

    Observable.concatDelayError(listObservables).subscribe(response ->
            {
                //This is where all results should be managed
                Log.d("response", String.valueOf(response));
            },
            error ->
            {
                Log.d("response", String.valueOf(error));
            });
    //Actual request occurs much later in application

    listObservables.get(0).subscribeOn(Schedulers.io()).
            observeOn(AndroidSchedulers.mainThread()).subscribe(response ->
    {
        // the response of this, should notify concatDelayError
        Log.d("respoonse", String.valueOf(response));
    });

1 Ответ

0 голосов
/ 28 февраля 2019

Если я правильно понимаю, вы хотите реализовать модель подзапросов .Для этой задачи вы можете разбить цепочку операторов на разные потоки выполнения и объединить их, например, с оператором zip.При таком подходе вы можете создать полностью независимый поток данных с единственным триггером.

Subject<Event> eventSubject = PublishSubject.create();

Observable<TriggerObject> mainRequest = eventSubject.flatMap((event) -> 
        RetrofitFactory.create().startProcess());
Observable<FirstSubResult> firstSubRequest = mainRequest.flatMap(tigger -> {
    // make first sub request
});
Observable<SecondSubResult> secondSubRequest = mainRequest.flatMap(tigger -> {
    // make second sub request
});
Observable<CompleteResult> resultObservable = Observable.zip(firstSubRequest, secondSubRequest,
        // zip function
        (first, second) -> {
            // combine result of sub requests to complete result object  
        });

Теперь вы можете запустить поток запросов по вашему событию:

// post your event. On button clicked for evxample
eventSubject.doOnNext(yourEvent);

ПРИМЕЧАНИЕ: этот ответ показываетОсновная идея цепочки последовательностей потоков данных.Это применимо к другим типам запросов, и вы можете использовать этот подход без модернизации

...