代码之家  ›  专栏  ›  技术社区  ›  Anton Shkurenko

RxJava将一个Observable拆分为两个子Observable

  •  4
  • Anton Shkurenko  · 技术社区  · 10 年前

    我对 RxJava 我花了一整天的时间来理解它,我正在思考如何解决这个问题:

    我有一件物品 Retrofit ,它包含两个 ArrayLists ,我必须以不同的方式处理每个ArrayList。目前看起来:

    apiService.getUser(token).enqueue(new Callback<User>() {
                @Override
                public void onResponse(Response<User> response) {
    
                    final User user = response.body();
    
                    for (Skill s : user.getSkills()) {
                        // process here first ArrayList
                    }
    
                    for (OrganizerAction o : user.getOrganizerActions()) {
                        // process here second ArrayList
                    }
                }
    
                @Override
                public void onFailure(Throwable t) {
                    t.printStackTrace();
                }
            });
    

    更新:

    public class User {
    
        // fields
    
        @SerializedName("organizer_actions")
        @Expose
        private List<OrganizerAction> mOrganizerActions;
    
        @SerializedName("skills")
        @Expose
        private List<Skill> mSkills;
    
        public List<OrganizerAction> getOrganizerActions() {
            return mOrganizerActions;
        }
    
        public List<Skill> getSkills() {
            return mSkills;
        }
    }
    

    谢谢
    安东

    1 回复  |  直到 10 年前
        1
  •  5
  •   iagreen    10 年前

    这个答案适用于改型2.0.0-beta版,这是您似乎正在使用的版本。此外,您没有给出POJO或服务定义,因此要使用通用的GitHubAPI示例作为指导,请修改以匹配指定的数据。

    第一步是将服务定义转换为使用 Observable 而不是 Call .

    public interface GitHubService {
        @GET("/users/{user}")
        Observable<User> getUser(@Path("user") String user);
    }
    

    哪里 User

    public class User {
        public String login;
        public int id;
    }
    

    接下来,使用 addCallAdapterFactory --

    Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("https://api.github.com/")
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .build();
    

    以常规方式获得服务--

    GitHubService gitHubService = retrofit.create(GitHubService.class);
    

    接下来,获取您的观察结果并致电 cache 在上面创建 可观察的 这将重播结果。通过该Observable,您可以多次订阅,在您的情况下,您可以订阅两次。对于您感兴趣的每种类型的数据,使用 map 函数从 使用者 对象设置为您的特定字段。 地图 允许您将函数应用于可观察数据中的数据。请参见 docs 了解更多详情。在本例中,我们将创建两个流。每个用于 id login 领域。

    Observable<User> getUserResult = gitHubService.getUser("octocat").cache(1);
    
    getUserResult.map(new Func1<User, Integer>() {
        @Override
        public Integer call(User user) {
            return user.id;
        }
    }).subscribe(new Action1<Integer>() {
        @Override
        public void call(Integer id) {
            Log.d("Stream 1", "id = " + id);
        }
    });
    
    getUserResult.map(new Func1<User, String>() {
        @Override
        public String call(User user) {
           return user.login;
        }
    }).subscribe(new Action1<String>() {
        @Override
        public void call(String login) {
            Log.d("Stream 2", "login = " + login);
        }
    });
    

    最后,确保渐变文件具有所需的相关性,

    compile 'io.reactivex:rxjava:1.0.14'
    compile 'com.squareup.retrofit:retrofit:2.0.0-beta1'
    compile 'com.squareup.retrofit:adapter-rxjava:2.0.0-beta1'
    compile 'com.squareup.retrofit:converter-gson:2.0.0-beta1'
    

    而且,与您的问题没有直接关系,但如果您打算在Android中使用RxJava,我建议您结账 Retrolambda 如果你还没有。上面的映射和订阅代码,以及一般的Rx代码,对于lambdas来说更加简洁。

    getUserResult.map(user -> user.id).subscribe(
            id -> { Log.d("Stream 1", "id = " + id); }
    );
    
    getUserResult.map(user -> user.login).subscribe(
            login -> { Log.d("Stream 2", "login = " + login); }
    );