Ant*_*nko 4 java android rx-java retrofit rx-android
我是全新的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();
}
});
Run Code Online (Sandbox Code Playgroud)
更新:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢,
安东
这个答案适用于Retrofit 2.0.0-beta,这是你似乎正在使用的.此外,您没有提供POJO或服务定义,因此要使用常规GitHub API示例作为指南,修改以匹配您的指定数据.
第一步是将您的服务定义转换为使用Observable而不是Call.
public interface GitHubService {
@GET("/users/{user}")
Observable<User> getUser(@Path("user") String user);
}
Run Code Online (Sandbox Code Playgroud)
哪里User是
public class User {
public String login;
public int id;
}
Run Code Online (Sandbox Code Playgroud)
接下来,将自定义呼叫适配器添加到您的改装构建器中addCallAdapterFactory-
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.github.com/")
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
Run Code Online (Sandbox Code Playgroud)
以通常的方式获得您的服务 -
GitHubService gitHubService = retrofit.create(GitHubService.class);
Run Code Online (Sandbox Code Playgroud)
接下来,获取您的observable并调用cache它来创建一个Observable将重放结果.从该Observable,您可以多次订阅,在您的情况下,您可以订阅两次.对于您感兴趣的每种类型的数据,使用该map函数从User对象转换为特定字段.map允许您将函数应用于observable中的数据.有关更多详细信息,请参阅文档.在这个例子中,我们将制作两个流.一个用于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);
}
});
Run Code Online (Sandbox Code Playgroud)
最后,确保您的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'
Run Code Online (Sandbox Code Playgroud)
并且,与您的问题没有直接关系,但如果您打算在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); }
);
Run Code Online (Sandbox Code Playgroud)