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() 是一个密集的调用,将这个调用限制在一个线程是不好的。我需要这种灵活性。

有没有人以这种方式使用领域找到任何解决方法?

例如,大多数示例往往侧重于从 Realm 获取与使用网络操作:

下面的例子:

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 回答