首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Realm + Retrofit + Rxjava

Realm + Retrofit + Rxjava
EN

Stack Overflow用户
提问于 2016-03-14 10:03:30
回答 3查看 5.8K关注 0票数 3

我正在尝试找到一种方法,通过rxjava observable将解析后的对象从retro保存到realm中。

现在我有一个API调用:

代码语言:javascript
复制
fetchCatalogData().subscribeOn(Schedulers.io())
                  .subscribe(data ->
                       saveToRealm();
                  )

这不起作用,因为我在不同的踏步上使用了realm,或者scheduler.io没有循环。我不确定使用retrofit、realm和rxjava的最佳方式是什么。我希望能够在数据从改装中到达时保存所有数据,然后在以后访问它。

EN

回答 3

Stack Overflow用户

发布于 2016-03-16 14:49:12

你可以利用一个非常好的库,它结合了这一切。

https://github.com/FabianTerhorst/ApiClient

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

票数 3
EN

Stack Overflow用户

发布于 2016-11-04 03:29:11

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

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

代码语言:javascript
复制
fetchCatalogData()
.subscribeOn(Schedulers.io())
.subscribe(data ->
     saveToRealm(data);
)

在这种情况下,只要saveToRealm()打开一个特定于线程的领域实例,就可以很好地工作:

代码语言:javascript
复制
private void saveToRealm(CatalogData data) {
    try(Realm r = Realm.getDefaultInstance()) {
        r.executeTransaction((realm) -> {
            realm.insertOrUpdate(data);
        });
    }
}

这将允许您在后台线程上创建一个域(自动关闭),并持久化到该域。

对于UI线程,您将为CatalogData创建一个查询,并且通过RxJava-support of Realm,您将获得一个附加到结果集的RealmChangeListener,并接收一个“热可观察性”,该“热可观察性”在底层表发生变化时为您提供结果。

代码语言:javascript
复制
Subscription showCatalog = realm.where(CatalogData.class)
                                .findAllAsync()
                                .filter(RealmResults::isLoaded)
                                .filter(RealmResults::isValid) 
                                .subscribe((results) -> {
                                    adapter.updateData(results);
                                });
票数 3
EN

Stack Overflow用户

发布于 2016-11-04 02:21:27

Realm可以与Retrofit 1.*和2.*一起使用,但请注意,Retrofit不会自动将对象添加到Realm,而是必须使用realm.copyToRealm()realm.copyToRealmOrUpdate()方法手动添加它们。

代码语言:javascript
复制
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类公开为ObservableRealmRealmResultsRealmObjectDynamicRealmDynamicRealmObject

代码语言:javascript
复制
// 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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35978400

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档