当前位置: 首页 > 知识库问答 >
问题:

如何使用rxjava/改装正确等待/观察来自服务器的传入数据

韩阳云
2023-03-14

我在从服务器下载数据时遇到问题,更具体地说,我无法实现“等待/观察传入数据”行为。我想用来自服务器的列表填充我的回收视图和微调器,但要知道,这些方法返回空列表。我理解,问题是该方法在数据到达之前完成。

我已经检查了这两个相似的问题,但没有一个答案对我有用:

等待API调用使用RxJava和Retrofit完成

RXJava改造等待UI等待从API获取数据

我的代码:

应用程序编程接口:

@GET("/api/categories")
Observable<Response<JsonObject>> getCategories();

netWorker:

public List<String> getCat() {
    List<String> incomingDataSet = new ArrayList<>();
    
    compositeDisposable.add(
        apiConnector.getCategories()
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(response -> {
                if (response.code() >= 200 && response.code() < 300) {
                    JsonArray incomingArray = response.body().getAsJsonArray("category");
                    
                    for (int i = 0; i < incomingArray.size(); i++) {
                        incomingDataSet.add(incomingArray.get(i).getAsJsonObject().get("categoryname").toString().replaceAll("\"", ""));
                        Log.i("LOG", "downloadCategories response: " + incomingDataSet.toString());
                    }

                } else {
                    Log.i("LOG", "Response error: " + response.code());
                }
            })
    );

    Log.i("LOG", "getCat: " + incomingDataSet.toString());
    
    return incomingDataSet;
}

主要活动:

List<String> categorylist = new ArrayList<>();
categorylist = netWorker.getCat();
Log.i("LOG", "list:" + categorylist );

所以,我在日志中看到的是:

第一:

getCat:[]

列表:[]

然后:

下载类别响应:[cat1]

下载类别响应:[cat1、cat2]

下载类别响应:[cat1、cat2、cat3]

共有1个答案

廉博赡
2023-03-14

在doOnSubscribe()中显示微调器,在doFinally()中隐藏微调器。将填充RecyclerView的代码放入subscribe()中,以便在数据到达时填充它。否则,您只会在主线程上获得空的新列表,并且不会进一步更新RecyclerView。

 类似资料:
  • 我有这个问题,我一直在寻找,但找不到解决方案(或者也许我不能根据其他答案做出解决方案)。 我的问题是,我需要找到一种方法来等待可观察的(有自己的订户)并等待另一个可观察的(有自己的订户)完成。 场景是这样的: 奥布1- 奥布斯2 - 我主要担心的是我需要两个订阅者。在我看来,obs1 和 obs2 并行运行,但需要检查 obs1 是否以新的会话令牌完成。也许这不是RxJava的主要目的。 Obs1

  • 我最近开始学习改装和rxjava。我在寻找关于如何等待和获得第一次观察结果的任何想法。基本上,我想在一个简单的登录上应用它。第一个api调用是获取服务器时间。第二个api调用将等待第一个调用的结果(即服务器时间)并利用它。 现在,我被困在这里了。在第二个可观察对象上,特别是在getNetworks方法上,我想使用我从第一个可观察对象得到的东西。有什么想法吗? 编辑: 我想先处理call 1的结果,

  • 问题内容: 我正在尝试重新启动服务器,然后使用以下命令等待: 但是我得到这个错误: 问题答案: 您应该将wait_for任务更改为local_action,然后指定要等待的主机。例如:

  • 我对rxjava还是个新手,刚刚开始学习它,并将我们的android项目转换为RX。所以我编写了Observable并使用flatmaps将它们链接起来,以调用API并返回一个Observable。现在,在主活动中,我订阅它们,并将我的UI代码添加到onNext、onSubscribe、onComplete和onError(如果适用)中。但是我有多个api,我为每个api都创建了一个observa

  • 假设我有一个要转换为反应流的事件发出数据源。数据源由资源(例如,定期发送更新状态的套接字)绑定,所以我希望共享对该资源的单个订阅。使用带有回放的单个observable(新订阅者可以立即获得当前值)和refCount操作符似乎非常适合这样做。例如,这是他的MyDataProvider的外观: 然而,现在假设我有另一个数据源,它需要第一个数据源的结果来计算其自身的值: 在这里,我的设置开始崩溃。第一

  • 我正在从事一个涉及Hystrix的项目,我决定使用RxJava。现在,忘记Hystrix的其余部分,因为我相信主要问题是我完全搞砸了正确编写可观察代码。 需要:我需要一种方法来返回一个代表多个可观察对象的可观察对象,每个可观察对象都运行一个用户任务。我希望该可观察对象能够返回任务的所有结果,甚至错误。 问题:可观测流会因错误而消亡。如果我有三个任务,而第二个任务引发了一个异常,那么即使第三个任务成