通过 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>
。
我创建一个 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>
。