【问题标题】:Realm + Retrofit + Rxjava领域 + 改造 + Rxjava
【发布时间】:2016-06-28 22:50:48
【问题描述】:

我正在尝试找出一种方法,通过 rxjava observable 将我的 Parsed 对象从复古保存到领域。

现在我有一个 API 调用:

fetchCatalogData().subscribeOn(Schedulers.io())
                  .subscribe(data ->
                       saveToRealm();
                  )

这不起作用,因为要么我在不同的踏板上使用领域,要么 scheduler.io 没有循环器。 我不确定使用改造、领域和 rxjava 的最佳方式是什么。我希望能够在改造后保存所有数据,然后再访问它。

【问题讨论】:

标签: android retrofit realm rx-java


【解决方案1】:

您可以利用一个非常好的库来结合所有内容。

https://github.com/FabianTerhorst/ApiClient

“一个易于使用的 api 客户端,将 Retrofit、Realm、Gson、Rxjava 和 Retrolambda 的强大功能结合在一个易于使用的 Java 和 Android 库中”

【讨论】:

    【解决方案2】:

    其实很简单,你只需要有两个不同的流——一个用于下载,一个用于显示数据。

    我假设 fetchCatalogData() 通过 Retrofit 返回数据,因此是非托管对象。

    fetchCatalogData()
    .subscribeOn(Schedulers.io())
    .subscribe(data ->
         saveToRealm(data);
    )
    

    在这种情况下,只要saveToRealm() 打开一个线程特定的 Realm-instance 就可以了:

    private void saveToRealm(CatalogData data) {
        try(Realm r = Realm.getDefaultInstance()) {
            r.executeTransaction((realm) -> {
                realm.insertOrUpdate(data);
            });
        }
    }
    

    这将允许您在后台线程上创建一个领域(它会自动关闭),并坚持到领域。


    对于 UI 线程,您将为 CatalogData 创建一个查询,并通过 Realm 的 RxJava 支持,您将获得一个附加到结果集的 RealmChangeListener,并接收一个“hot Observable”,它会在底层运行时为您提供结果表更改。

    Subscription showCatalog = realm.where(CatalogData.class)
                                    .findAllAsync()
                                    .filter(RealmResults::isLoaded)
                                    .filter(RealmResults::isValid) 
                                    .subscribe((results) -> {
                                        adapter.updateData(results);
                                    });
    

    【讨论】:

      【解决方案3】:

      Realm 可与 Retrofit 1.* 和 2.* 一起使用,但请注意,Retrofit 不会自动将对象添加到 Realm,而是您必须使用 realm.copyToRealm()realm.copyToRealmOrUpdate() 方法手动添加它们。

      GitHubService service = restAdapter.create(GitHubService.class);
      List<Repo> repos = service.listRepos("octocat");
      
      // Copy elements from Retrofit to Realm to persist them.
      realm.beginTransaction();
      List<Repo> realmRepos = realm.copyToRealmOrUpdate(repos);
      realm.commitTransaction();
      

      Realm 还对 RxJava 提供一流的支持,这意味着可以将以下 Realm 类公开为 ObservableRealmRealmResultsRealmObjectDynamicRealmDynamicRealmObject

      // Combining Realm, Retrofit and RxJava (Using Retrolambda syntax for brevity)
      // Load all persons and merge them with their latest stats from GitHub (if they have any)
      Realm realm = Realm.getDefaultInstance();
      GitHubService api = retrofit.create(GitHubService.class);
      realm.where(Person.class).isNotNull("username").findAllAsync().asObservable()
      .filter(persons.isLoaded)
      .flatMap(persons -> Observable.from(persons))
      .flatMap(person -> api.user(person.getGithubUserName())
      .observeOn(AndroidSchedulers.mainThread())
      .subscribe(user -> showUser(user));
      

      这个官方Realmdocs

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-21
        • 1970-01-01
        • 2013-06-02
        • 2018-10-05
        • 2016-01-20
        相关资源
        最近更新 更多