RxJava2 在 toList 之后没有收到 doOnNext

RxJava2 not receiving doOnNext after toList

我正在做一个项目,在这个项目中我想迭代一个 List 并在返回结果之前将它们组合回去。基本上我正在尝试将 PostResponse 对象转换为 Post.

一些相关代码。

Post.java

public class Post {
    @NonNull private User user;
    @NonNull private String title;
    @NonNull private String body;
    @NonNull private Integer id;
}

PostResponse.java

public final class PostResponse{
    private Integer userId;
    private Integer id;
    private String title;
    private String body;
}

获取帖子

 @Override public Observable<List<Post>> posts() {
        return postDataStore.getAllPosts()
                .flatMap(postResponses -> Observable.fromIterable(postResponses)
                        .flatMap(postResponse -> postDataMapper.transform(postResponse))
                        // Receiving output here
                        .doOnNext(post -> Log.i(TAG, "posts: " + post))
                        .toList()
                        .toObservable()
                        // Not Receiving output here
                        .doOnNext(posts -> Log.i(TAG, "posts: " + posts)));
    }

上面调用的转换函数。

public Observable<Post> transform(final PostResponse postResponse) {
        return Observable.create(emitter -> {
            final Post post = new Post(postResponse.getId());
            post.setTitle(postResponse.getTitle());
            post.setBody(postResponse.getBody());
            userRepository.user(postResponse.getUserId()).doOnNext(user -> {
                post.setUser(user);
                emitter.onNext(post);
            }).subscribe();
        });
    }

但是我在 doOnNext 上没有收到订阅 posts() 的任何数据。不知道哪里出了问题。

如果我犯了一个非常愚蠢的错误,我深表歉意。

快速解决方法是添加:

emitter.onComplete();

就在您 emitter.onNext(post);

之后

但是,我建议重新考虑设计和逻辑。特别是您的转换不需要创建新的 Observable。我会像这样重新设计您的 tranform 方法:

Observable<Post> transform(PostResponse postResponse) {
    return userRepository.user(postResponse.getUserId())
        .map(user -> parseResponse(parseResponse, user));
}


Post parseResponse(PostResponse response, User user) {
    final Post post = new Post(postResponse.getId());
    post.setTitle(postResponse.getTitle());
    post.setBody(postResponse.getBody());   
    post.setUser(user);

    return post;
}

通过这种方式,您可以避免创建新的 Observable,避免内部订阅,并且您对结果只有一个控制点,即在最终结果 Observable 的订阅中.