繁体   English   中英

Realm + Retrofit + Rxjava

[英]Realm + Retrofit + Rxjava

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

现在我有一个API调用:

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

这不起作用,因为我在不同的踏板上使用领域或者scheduler.io没有looper。 我不确定使用改造,领域和rxjava的最佳方法是什么。 我希望能够在从改造到达时保存我的所有数据,然后再访问它。

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

https://github.com/FabianTerhorst/ApiClient

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

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

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

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

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

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

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


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

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

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类可以作为Observable公开: RealmRealmResultsRealmObjectDynamicRealmDynamicRealmObject

// 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));

这个官方的Realm 文档

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM