【问题标题】:How to create Observables and update them with Retrofit later RxJava?如何创建 Observables 并使用 Retrofit 后来的 RxJava 更新它们?
【发布时间】:2019-07-22 01:41:12
【问题描述】:

基本上我需要创建一个没有初始值的 Observable 列表。我订阅了 Observables 列表,并将根据所有 Observables 的响应提供所需的结果。我使用 zip 运算符。

问题是我最初需要创建 Observables,将它们添加到列表中并使用 zip 运算符。只是后来我使用 Retrofit 进行网络请求,我需要更新列表中 observable 的值,这样我的整个 zip 运算符才能正常工作。

但是,我没有找到一种方法来强制使用 Retrofit 的响应更新列表中的 observable。这似乎很容易,但我没有找到任何解决方案..唯一的想法是使用大量主题并将它们添加到列表中......

 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));
    });

【问题讨论】:

  • 我不完全理解你的问题。您能否发布您的代码以便更好地理解您的问题?
  • 好的,我已经更新了:)

标签: android observable retrofit rx-java rx-java2


【解决方案1】:

如果我理解正确,您想实现子请求模型。对于此任务,您可以将运算符链分解为不同的执行流并将其组合回来,例如,使用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);

注意:这个答案显示了链接数据流序列的主要思想。这适用于其他类型的请求,您无需改造即可使用此方法

【讨论】:

  • 哇,真是天才的解决方案..可能是一个需要这个案例的案例
  • 仍然不是我真正需要的... Observable secondSubRequest = mainRequest.flatMap(tigger -> { // 进行第二个子请求 });这应该有额外的触发器,因为它不仅需要等待 startProcess() 完成,而且实际上需要用户按下按钮...
  • @ViktorVostrikov 为此,您可以使用Subjectconvenient libraries。我已经更新了答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-13
  • 2019-03-22
  • 2019-04-02
  • 2015-12-09
  • 1970-01-01
  • 2020-01-02
  • 2020-11-10
相关资源
最近更新 更多