从Observable读取对象值

PPK*_*PK 4 rx-java

有没有办法可以在下面的代码中从userObservable返回用户列表.基本上如何读取Observable的对象值.

public List<User> getUserList(){
    Observable<Map<String, Object>> userDetailsObservable = getUserDetails(...);
    Observable<Map<String, Object>> userLikesObservable = getUserLikes(...);
    Observable<List<User>> userObservable = Observable.zip(userDetailsObservable,
            userLikesObservable, new Func2<Map<String, Object>, Map<String, Object>, List<User>>() {
                public List<User> call(Map<String, Object> value1, Map<String, Object> value2) {
                    List<User> userList = new ArrayList<User>();
                    //Iterating both maps and composing user list here.
                    return userList;
                }
            });
    userObservable.subscribe(new Subscriber<List<User>>() {
        @Override
        public void onNext(List<User> userList) {
            System.out.println("Merged values " + userList);
        }

        @Override
        public void onError(Throwable error) {
            System.err.println("Error: " + error.getMessage());
        }

        @Override
        public void onCompleted() {
            System.out.println("Sequence complete.");
        }
    });
    // Throws ClassCastException which is expected... How do I get the user list from userObservable
    List<User> userList = List<User> userObservable;

    return userList; //Fetch the user list from userObservable and return
}
Run Code Online (Sandbox Code Playgroud)

kjo*_*nes 14

你需要订阅userObservable.然后,您将获得数据可用时发出的用户列表.

userObservable
    .subscribe(users -> {
        for (User user : users) {
            // Do what you want with user.
        }
    });
Run Code Online (Sandbox Code Playgroud)

编辑:要返回列表,您需要使用toBlocking()呼叫.然后,您可以使用其中一个Blocking Observable Operators来获得所需的效果.最有可能first()single()将为你工作.

return userObservable
    .toBlocking()
    .first();
Run Code Online (Sandbox Code Playgroud)

  • 注意,不鼓励阻塞observable:`BlockingObservable是一种提供阻塞运算符的Observable.它可用于测试和演示目的,但通常不适用于生产应用程序(如果您认为需要使用BlockingObservable,这通常表明您应该重新考虑您的设计).所以也许你必须重新考虑你是什么在更高的层面上做... (2认同)
  • @Azurespot,“toBlocking()”和“subscribe()”是互斥的。使用其中之一。小心“toBlocking()”,如果你有无限的可观察值,它可能会永远等待。 (2认同)