Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/197.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 改进链式观测_Android_Asynchronous_Retrofit_Observable_Rx Java - Fatal编程技术网

Android 改进链式观测

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

我正在尝试使用rxjava进行改造。我有一个问题,就是如何将改装观测值彼此链接,或者如何将改装观测值与我创建的观测值链接。例如:

    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) });