簡體   English   中英

RxJava將一個Observable拆分為兩個subObservable

[英]RxJava split one Observable to two subObservables

我是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;
    }
}

謝謝,
安東

這個答案適用於Retrofit 2.0.0-beta,這是你似乎正在使用的。 此外,您沒有提供POJO或服務定義,因此要使用常規GitHub API示例作為指南,修改以匹配您的指定數據。

第一步是將服務定義轉換為使用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);

接下來,獲取您的observable並在其上調用cache以創建將重放結果的Observable 從該Observable,您可以多次訂閱,在您的情況下,您可以訂閱兩次。 對於您感興趣的每種類型的數據,使用map函數將User對象轉換為特定字段。 map允許您將函數應用於observable中的數據。 有關更多詳細信息,請參閱文檔 在這個例子中,我們將制作兩個流。 idlogin字段各一個。

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

最后,確保您的gradle文件具有所需的依賴項,

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM