簡體   English   中英

Realm + Retrofit + Rxjava

[英]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公開: RealmRealmResultsRealmObjectDynamicRealmDynamicRealmObject

// 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM