Realm + Retrofit + Rxjava

时间:2016-03-14 02:03:30

标签: android retrofit realm rx-java

我试图想办法通过rxjava observable将我的Parsed对象从retro复制到域中。

现在我有一个API调用:

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

这不起作用,因为我在不同的踏板上使用领域或者调度程序。我没有一个活套。 我不确定使用改造,领域和rxjava的最佳方式是什么。我希望能够在从改造到达时保存我的所有数据,然后再访问它。

3 个答案:

答案 0 :(得分:3)

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

https://github.com/FabianTerhorst/ApiClient

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

答案 1 :(得分:3)

它实际上相当简单,您只需要有两个不同的流 - 一个用于下载,另一个用于显示数据。

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

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

在这种情况下,只要saveToRealm()打开一个特定于线程的Realm实例,这就可以了。

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

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

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

答案 2 :(得分:1)

Realm适用于Retrofit 1. *和2. *开箱即用,但请注意Retrofit不会自动向Realm添加对象,而是必须使用realm.copyToRealm()或{{1}手动添加它们方法。

realm.copyToRealmOrUpdate()

此外,Realm还拥有对RxJava的一流支持,这意味着以下Realm类可以作为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(); 公开:ObservableRealmRealmResults,{ {1}}和RealmObject

DynamicRealm

这个官方领域docs