使用 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();
   }
}

你可以这样做:

  1. 在您的 class
  2. 中指定 MutableLiveData 实例
  3. 创建方法来提供它
  4. Post 值变为 liveData 当您的 Observable returns 值
  5. 不要忘记处理你的 observables
  6. 毕竟我建议你使用存储库

您的代码:

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