[英]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
公开: 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));
这个官方的Realm 文档 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.