Android 改进链式观测
我正在尝试使用rxjava进行改造。我有一个问题,就是如何将改装观测值彼此链接,或者如何将改装观测值与我创建的观测值链接。例如:Android 改进链式观测,android,asynchronous,retrofit,observable,rx-java,Android,Asynchronous,Retrofit,Observable,Rx Java,我正在尝试使用rxjava进行改造。我有一个问题,就是如何将改装观测值彼此链接,或者如何将改装观测值与我创建的观测值链接。例如: Observable<List<Friend>> friendsListObservable = friendsService.getFriends(); Observable<Void> updateReqestObservable = friendsListObservable.switchMap(friends
Observable<List<Friend>> friendsListObservable = friendsService.getFriends();
Observable<Void> updateReqestObservable = friendsListObservable.switchMap(friends -> {
Log.d(TAG, "Hello");
return userAPI.updateFriends(session.getUserId(), friends);
}).subscribe();
}在实际调用点避免阻塞的一种方法是将其订阅给主题,然后在代码要求执行请求的任何部分结束时阻塞主题 例如:
final ReplaySubject<Void> subject = ReplaySubject.create();
friendsService.getFriends()
.switchMap(friends -> userApi.updateFriends(session.getUserId(), friends))
.subscribeOn(Schedulers.io())
.subscribe(subject);
// Do other things that don't require this to be done yet...
// Wherever you need to wait for the request to happen:
subject.toBlocking().singleOrDefault(null);
forEach
与subscribe
非常相似,只是它显式地阻止了。您甚至可以将其与原始代码一起使用,但添加一个空的onNext
操作不会非常干净
如果您还可以提供有关应用程序结构的更多详细信息(这都是主方法吗?是Android应用程序吗?等等),我可以提供更多关于尽可能避免阻塞的建议。您是否尝试过使用flatMap或concatMap而不是switchMap?我不认为问题出在开关图上,但因为我不太了解这个接线员……我试过了,没有接线员接到电话,它仍然卡住了
onError
也不会被调用。唯一有效的方法是我直接订阅可观察的。我想这可能与线程有关,但我不确定。最后我使用了observable.toBlocking()
。我知道这不是一个好的做法,但现在我们会这样做,如果有人偶然发现了同样的问题并找到了答案,请毫不犹豫地发布它。嗯,是的,你是对的。事实上,您的调用是异步进行的,您的主方法将在得到结果之前停止。因此,您必须阻止主方法。所以Toblock是一个很好的陷阱。谢谢你的帮助,我用全部代码更新了我的帖子。我很确定我做错了什么。如果你有一个关于如何在rx中封装Facebook SDK之类的东西的例子,那将非常有用。
final ReplaySubject<Void> subject = ReplaySubject.create();
friendsService.getFriends()
.switchMap(friends -> userApi.updateFriends(session.getUserId(), friends))
.subscribeOn(Schedulers.io())
.subscribe(subject);
// Do other things that don't require this to be done yet...
// Wherever you need to wait for the request to happen:
subject.toBlocking().singleOrDefault(null);
friendsService.getFriends()
.forEach(friends -> { userApi.updateFriends(session.getUserId(), friends) });