使用 RxJava 从集成改造中获取实时数据响应
get livedata response from integrated retrofit with RxJava
我想从与 RxJava 集成的 Retrofit 获取实时数据响应以调用 API。
我知道 RxJava 响应是流式的,无法将其放入 Livedata directly.So 感谢您的帮助。
这里是一个用RxJava集成Retrofit的示例代码。
如何用 Livedata 替换 Observable。
class GitHubRxService {
private GitHubRxApi gitHubApi;
GitHubRxService() {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.github.com/")
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
gitHubApi = retrofit.create(GitHubRxApi.class);
}
Observable<String> getTopContributors(String userName) {
return gitHubApi.listRepos(userName)
.flatMapIterable(x -> x)
.flatMap(repo -> gitHubApi.listRepoContributors(userName, repo.getName()))
.flatMapIterable(x -> x)
.filter(c -> c.getContributions() > 100)
.sorted((a, b) -> b.getContributions() - a.getContributions())
.map(Contributor::getName)
.distinct();
}
}
你可以这样做:
- 在您的 class
中指定 MutableLiveData
实例
- 创建方法来提供它
- Post 值变为
liveData
当您的 Observable
returns 值
- 不要忘记处理你的 observables
- 毕竟我建议你使用存储库
您的代码:
class GitHubRxService {
private GitHubRxApi gitHubApi;
private MutableLiveData<String> liveData = new MutableLiveData();
private CompositeDisposable disposables = new CompositeDisposable();
private GitHubRxService() {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.github.com/")
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
gitHubApi = retrofit.create(GitHubRxApi.class);
}
public LiveData<String> getLiveData() {
return liveData;
}
void getTopContributors(String userName) {
Disposable d = gitHubApi.listRepos(userName)
.flatMapIterable(x -> x)
.flatMap(repo -> gitHubApi.listRepoContributors(userName, repo.getName()))
.flatMapIterable(x -> x)
.filter(c -> c.getContributions() > 100)
.sorted((a, b) -> b.getContributions() - a.getContributions())
.map(Contributor::getName)
.distinct()
.subscribe(
result -> {
liveData.postValue(result);
},
e -> {
e.printStackTrace();
},
() -> {
Log.d("Done")
}
);
disposables.add(d)
}
public void dispose(){
disposables.dispose();
}
}
您是否考虑过使用其中包含 LiveData 属性 的存储库并通过调用设置其值?
所以一般来说,当您从存储库调用函数时 getTopContributors
- 它会 return liveData,并进行网络调用。在网络订阅中 - 您更新 liveData
我想从与 RxJava 集成的 Retrofit 获取实时数据响应以调用 API。 我知道 RxJava 响应是流式的,无法将其放入 Livedata directly.So 感谢您的帮助。
这里是一个用RxJava集成Retrofit的示例代码。 如何用 Livedata 替换 Observable。
class GitHubRxService {
private GitHubRxApi gitHubApi;
GitHubRxService() {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.github.com/")
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
gitHubApi = retrofit.create(GitHubRxApi.class);
}
Observable<String> getTopContributors(String userName) {
return gitHubApi.listRepos(userName)
.flatMapIterable(x -> x)
.flatMap(repo -> gitHubApi.listRepoContributors(userName, repo.getName()))
.flatMapIterable(x -> x)
.filter(c -> c.getContributions() > 100)
.sorted((a, b) -> b.getContributions() - a.getContributions())
.map(Contributor::getName)
.distinct();
}
}
你可以这样做:
- 在您的 class 中指定
- 创建方法来提供它
- Post 值变为
liveData
当您的Observable
returns 值 - 不要忘记处理你的 observables
- 毕竟我建议你使用存储库
MutableLiveData
实例
您的代码:
class GitHubRxService {
private GitHubRxApi gitHubApi;
private MutableLiveData<String> liveData = new MutableLiveData();
private CompositeDisposable disposables = new CompositeDisposable();
private GitHubRxService() {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.github.com/")
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
gitHubApi = retrofit.create(GitHubRxApi.class);
}
public LiveData<String> getLiveData() {
return liveData;
}
void getTopContributors(String userName) {
Disposable d = gitHubApi.listRepos(userName)
.flatMapIterable(x -> x)
.flatMap(repo -> gitHubApi.listRepoContributors(userName, repo.getName()))
.flatMapIterable(x -> x)
.filter(c -> c.getContributions() > 100)
.sorted((a, b) -> b.getContributions() - a.getContributions())
.map(Contributor::getName)
.distinct()
.subscribe(
result -> {
liveData.postValue(result);
},
e -> {
e.printStackTrace();
},
() -> {
Log.d("Done")
}
);
disposables.add(d)
}
public void dispose(){
disposables.dispose();
}
}
您是否考虑过使用其中包含 LiveData 属性 的存储库并通过调用设置其值?
所以一般来说,当您从存储库调用函数时 getTopContributors
- 它会 return liveData,并进行网络调用。在网络订阅中 - 您更新 liveData