当通过 BehaviorRelay 路由时,必须在 Retrofit 上调用 subscribe() 两次可观察



我创建一个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()的电话吗?

为什么会这样?

你期望会发生什么?你期望BehaviorRelay发出List<Release>吗?

你声明了BehaviorRelay<Object>实际上是BehaviorRelay<Observable>,所以你发出Observable而不是List<Release>

我认为这就是您的目的:

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

现在,当订阅relay时,您将获得List<Release>

最新更新