通过 BehaviorRelay 路由时,必须在 Retrofit observable 上调用 subscribe() 两次

Having to call subscribe() on Retrofit observable twice when routed through BehaviorRelay

我创建一个 BehaviorRelay 然后使用 accept() 开始网络调用。

BehaviorRelay<Object> behaviorRelay = BehaviorRelay.createDefault(Observable.empty());
behaviorRelay.accept(searchDiscogsInteractor.getArtistsReleases(id));

这是通过网络调用完成的Observable:

public Single<List<Release>> getArtistsReleases(String artistId)
    {
        return discogsService.getArtistReleases(artistId, token, "asc", "500")
                .subscribeOn(Schedulers.io())
                .observeOn(Schedulers.io())
                .flatMapIterable(RootReleaseResponse::getReleases)
                .filter(release -> !release.getRole().equals("TrackAppearance"))
                .toList();
    }

当我然后 subscribe()BehaviorRelay 我需要订阅订阅以获得正确的结果。在第一个订阅中,我得到一个 ObservableToListSingle,然后我可以 subscribe() 然后得到正确的值。

behaviorRelay.subscribe(o ->
        {
            Log.e(TAG, o.toString());
            ((ObservableToListSingle) o).subscribe(o1 ->
                    Log.e(TAG, o1.toString())); <-- correct value
        });

为什么会这样?我是不是漏接了 subscribe() 的电话?

Why is this happening?

你期望会发生什么?您是否期望 BehaviorRelay 发出 List<Release>

您声明的 BehaviorRelay<Object> 实际上是 BehaviorRelay<Observable>,因此您发出的是 Observable 而不是 List<Release>

我想这就是你的目的:

searchDiscogsInteractor.getArtistsReleases(id)
                       .subscribe(releaseList -> relay.accept(releaseList));

现在,如果订阅 relay,您将获得 List<Release>