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

RxJava 2,改造2 Retrolambda-将2个请求链接在一起

狄河
2023-03-14

第一个API调用返回一个元素列表,然后我想随后调用另一个API,在第一个API调用的列表的每个元素中返回一个String。我(想我)已经得到了它,所以它用列表的每个元素调用第二个应用编程接口调用,但是我不确定如何订阅它来获得第二个调用返回的结果。

discogsService.getSearchResults(searchTerm, mContext.getString(R.string.token))
                .observeOn(AndroidSchedulers.mainThread())
                .subscribeOn(Schedulers.io())
                // Turns the result into individual elements
                .flatMapIterable(RootSearchResponse::getSearchResults)
                // I believe this then calls .getRelease() with each ID string
                .map(result -> discogsService.getRelease(result.getId()));

改装接口:

public interface DiscogsService
{
    @GET("database/search?")
    Observable<RootSearchResponse> getSearchResults(@Query("q") String searchTerm, @Query("token") String token);

    @GET("releases/")
    Observable<Release> getRelease(@Query("release_id") String releaseId);
}

我不确定从这里去哪里。

我相信。订阅(…)然后使我能够获得可观察的

有没有一种方法可以让我直接从模型层返回每个可观察的对象,这样我就不需要有两个单独的。订阅(…) s?或者我应该使用两个单独的。订阅(…) s,因为我可以捕获它们两个上的错误?我只想要第二次通话的结果。

以下是我尝试过的完整代码:

在模型中:

discogsService.getSearchResults(searchTerm, mContext.getString(R.string.token))
                .observeOn(AndroidSchedulers.mainThread())
                .subscribeOn(Schedulers.io())
                .flatMapIterable(RootSearchResponse::getSearchResults)
                .subscribeOn(Schedulers.io())
                .map(result -> discogsService.getRelease(result.getId()))
                .subscribe(new Observer<Observable<Release>>()
                {
                    @Override
                    public void onSubscribe(Disposable d)
                    {

                    }

                    @Override
                    public void onNext(Observable<Release> value)
                    {
                        mainPresenter.addToRecyclerView(value);
                    }

                    @Override
                    public void onError(Throwable e)
                    {

                    }

                    @Override
                    public void onComplete()
                    {

                    }
                });

在演示者:

@Override
public void addToRecyclerView(Observable<Release> value)
{
    value       .observeOn(AndroidSchedulers.mainThread())
                .subscribeOn(Schedulers.io())
                .subscribe(new Observer<Release>()
                {
                    @Override
                    public void onSubscribe(Disposable d)
                    {

                    }

                    @Override
                    public void onNext(Release value)
                    {
                        Log.e(TAG, "Success! " + value);
                        results.add(value);
                    }

                    @Override
                    public void onError(Throwable e)
                    {
                        Log.e(TAG, "Error: " + e.toString());
                        Log.e(TAG, "Error: " + e.toString());
                    }

                    @Override
                    public void onComplete()
                    {

                    }
                });

共有1个答案

龙飞文
2023-03-14

我宁愿公开一个可见的

Observable<Release> getReleases(...) {
    return discogsService.getSearchResults(...)
        .flatMapIterable(RootSearchResponse::getSearchResults)
        .flatMap(result -> discogsService.getRelease(result.getId()));
}

演讲者只会订阅它:

getReleases
    .observeOn(AndroidSchedulers.mainThread())
    .subscribeOn(Schedulers.io())
    .subscribe(new Observer<Release>()
    {
        @Override
        public void onSubscribe(Disposable d)
        {

        }

        @Override
        public void onNext(Release value)
        {
            Log.e(TAG, "Success! " + value);
            results.add(value);
        }

        @Override
        public void onError(Throwable e)
        {
            Log.e(TAG, "Error: " + e.toString());
            Log.e(TAG, "Error: " + e.toString());
        }

        @Override
        public void onComplete()
        {

        }
    });

只有一个可以观察到。注意,对于getReleases(…)中的第二个请求,从map()切换到flatMap() 。在幕后,这是发生第二次订阅的地方。

最终订阅将接收来自两个请求的错误。我更喜欢让消费者(演示者)处理错误,因为他们关心响应,知道在出现错误时该怎么做(例如显示消息)。

这是一个谁'驱动'观察,谁创造,处置它,所以这也是他的职责分配线程imho。

从一层暴露到另一层,可观察性非常好。它描述了数据类型、如何使用它以及模式(可观察?单一?流动?)。

 类似资料:
  • 球门 在我的应用程序中,我希望使用改装2上传一些文件到我的网络服务器(一次多个,在这种情况下是图片。)到那个特定的文件。 尝试 我对使用函数式编程范式不熟悉,所以我的理解可能会被误导。我有两个不同的对象,一个文件响应(DTO表示从我的网络服务器上传文件后的响应)和一个照片对象。这个Photo对象有两个字段,并充当在我的后端服务器中持久化的实体。它的字段对应于列,并且单独上传这些对象可以很好地工作。

  • 问题内容: 一般而言,我对RXJava相对较新(真的只是开始将其与RXJava2一起使用),而且我能找到的大多数文档都倾向于RXJava1。我现在通常可以在两者之间进行翻译,但是整个Reactive的内容是如此之大,以至于它是一个压倒性的API,具有很好的文档(当您可以找到它时)。我正在尝试简化我的代码,这是我想用婴儿的脚步做到的。我要解决的第一个问题是我在当前项目中做的很多工作: 您有一个请求,

  • 问题内容: 我有两个完成。我想做以下情形:如果第一个Completable到达onComplete,则继续第二个Completable。最终结果将是第二完成的onComplete。 当我有单个 getUserIdAlreadySavedInDevice() 和Completable login() 时,这就是我的方法: 问题答案: 您正在寻找运营商。 返回一个Completable,它首先运行此C

  • 问题内容: 我正在寻找一种可以链接多个HTTP请求的良好模式。我想使用Swift,最好使用Alamofire。 举例来说,我要执行以下操作: 发出PUT请求 发出GET请求 用数据重新加载表 承诺的概念似乎很适合此目的。如果我可以执行以下操作,则PromiseKit可能是一个不错的选择: 但这是不可能的,或者至少我不知道。 如何在不嵌套多个方法的情况下实现此功能? 我是iOS的新手,所以也许我缺少

  • 我正在尝试从使用普通改型迁移到使用RxJava扩展进行改型,以便在后台线程上进行API调用链。 例如,我有一个名为ModelGroup的对象,它有一个ModelPerson对象列表。我的目标是做到以下几点。 将ModelGroup发送到服务器并接收一个响应,它是一个整数,表示新插入的ID,我们称之为newGroupId 对于ModelGroup中的每个ModelPerson,设置Person。gr

  • 问题内容: 我需要链接来自Google Maps API的一些API请求,而我正在尝试使用Axios来实现。 这是第一个请求,它在componentWillMount()中 这是第二个请求: 然后,我们有第三个请求,这取决于前两个请求是否完成: 如何链接这三个电话,以便第三个电话发生在前两个电话之后? 问题答案: 首先,不确定是否要在其中执行此操作,最好将其插入并具有一些默认状态,这些状态一旦完成