我试图想办法通过rxjava observable将我的Parsed对象从retro复制到域中。
现在我有一个API调用:
fetchCatalogData().subscribeOn(Schedulers.io())
.subscribe(data ->
saveToRealm();
)
这不起作用,因为我在不同的踏板上使用领域或者调度程序。我没有一个活套。 我不确定使用改造,领域和rxjava的最佳方式是什么。我希望能够在从改造到达时保存我的所有数据,然后再访问它。
答案 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();
公开:Observable
,Realm
,RealmResults
,{ {1}}和RealmObject
。
DynamicRealm
这个官方领域docs。