我正在尝试找到一种方法,通过rxjava observable将解析后的对象从retro保存到realm中。
现在我有一个API调用:
fetchCatalogData().subscribeOn(Schedulers.io())
.subscribe(data ->
saveToRealm();
)这不起作用,因为我在不同的踏步上使用了realm,或者scheduler.io没有循环。我不确定使用retrofit、realm和rxjava的最佳方式是什么。我希望能够在数据从改装中到达时保存所有数据,然后在以后访问它。
发布于 2016-03-16 14:49:12
你可以利用一个非常好的库,它结合了这一切。
https://github.com/FabianTerhorst/ApiClient
易于使用的api客户端,将Retrofit、Realm、Gson、Rxjava和Retrolambda的强大功能结合在一个易于使用的Java和Android库中
发布于 2016-11-04 03:29:11
它实际上相当简单,您所需要做的就是有两个不同的流-一个用于下载,一个用于显示数据。
我假设fetchCatalogData()通过Retrofit返回数据,因此返回非托管对象。
fetchCatalogData()
.subscribeOn(Schedulers.io())
.subscribe(data ->
saveToRealm(data);
)在这种情况下,只要saveToRealm()打开一个特定于线程的领域实例,就可以很好地工作:
private void saveToRealm(CatalogData data) {
try(Realm r = Realm.getDefaultInstance()) {
r.executeTransaction((realm) -> {
realm.insertOrUpdate(data);
});
}
}这将允许您在后台线程上创建一个域(自动关闭),并持久化到该域。
对于UI线程,您将为CatalogData创建一个查询,并且通过RxJava-support of Realm,您将获得一个附加到结果集的RealmChangeListener,并接收一个“热可观察性”,该“热可观察性”在底层表发生变化时为您提供结果。
Subscription showCatalog = realm.where(CatalogData.class)
.findAllAsync()
.filter(RealmResults::isLoaded)
.filter(RealmResults::isValid)
.subscribe((results) -> {
adapter.updateData(results);
});发布于 2016-11-04 02:21:27
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));这是官方领域的docs。
https://stackoverflow.com/questions/35978400
复制相似问题