【问题标题】: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
【解决方案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 类公开为 Observable:Realm、RealmResults、RealmObject、DynamicRealm 和 DynamicRealmObject。
// 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。