1

する必要がある :

  • バックグラウンド スレッドで API からデータをフェッチする
  • UI にデータを表示する
  • レルムに保存します。

    fetchItemsFromServer().subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread()).subscribe(new Action1<ItemList>() {
        @Override
        public void call(ItemList items) {
    
            displayItems(items);
    
            try {
                realm.beginTransaction();
                realm.copyToRealmOrUpdate(itemList);
                realm.commitTransaction();
                Logger.v("Realm ", "Copied list object to realm");
            } catch (Exception e) {
                Logger.e("Realm Something went wrong ", e);
                realm.cancelTransaction();
            }
    
        }
    }
    

これはエラーをスローします:間違ったスレッドからアクセスされたレルム

同時に異なるメッセージを取得する 4 つのタブがあります。

fetchItemsFromServer() は集中的な呼び出しであり、この呼び出しを 1 つのスレッドに限定するのは適切ではありません。この柔軟性が必要です。

このようにレルムを使用して回避策を見つけた人はいますか?

たとえば、ほとんどの例は、レルムからのフェッチとネットワーク操作の操作に焦点を当てている傾向があります。

以下の例:

Rxjava - https://realm.io/news/realm-java-0.87.0/

RxJava でのレルムの使用 - https://realm.io/news/using-realm-with-rxjava/ (以前のソリューションですが、パフォーマンスの欠点)

My Realm は、依存性注入 (Dagger 2) を介してデータベース モジュールによって提供されます。

@Module
public class DatabaseModule {

    public static final String REALM_FILE_NAME = "Realm name";

    @Provides
    Realm providesRealmInstance(Context context) {
    return Realm.getInstance(
            new RealmConfiguration.Builder(context)
                    .name(REALM_FILE_NAME)
                    .build());
    }
}
4

1 に答える 1

4

UI スレッドにデータを保存する代わりに、次のパターンを使用してバックグラウンドで保存します。

fetchItemsFromServer()
    .doOnNext(new Action1<ItemList>() {
        @Override
        public ItemList call(ItemList list) {
            // Save data on the background thread
            Realm realm = Realm.getDefaultInstance();
            realm.beginTransaction();
            realm.copyToRealmOrUpdate(list);
            realm.commitTransaction();
            realm.close();
        }
    })
  .subscribeOn(Schedulers.io())
  .observeOn(AndroidSchedulers.mainThread())
  .subscribe(new Action1<ItemList>() {
    @Override
    public void call(ItemList items) {
        displayItems(items);
    }
}
于 2016-01-15T14:09:32.063 に答える