2016-01-14 77 views
1

觀察在不同的線程我需要:領域,網絡運營,訂閱與RxJava

  • 從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()是一個密集型調用,並將此調用限制在一個線程中並不好。我需要這種靈活性。

有沒有人發現使用領域這種方式的任何解決方法?

大多數例子如往往集中在與境界獲取VS與網絡運營工作:

舉例如下:

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

使用領域與RxJava - https://realm.io/news/using-realm-with-rxjava/(以前的解決方案,但性能缺點)

我的領域由數據庫模塊通過依賴注入提供(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()); 
    } 
} 
+0

你從哪兒在用戶讓你的領域實例?訂閱者正在UI線程上進行保存,所以如果你的Realm實例也在那裏創建,它應該可以工作。 –

+0

@ChristianMelchior我的境界是通過依賴注入注入的。一旦我刪除了API調用的subscribeOn(Schedulers.io()),一切正常。 – AndroidEnthusiast

+0

刪除'subscribeOn(Schedulers.io())'應該不會影響您的訂閱者,因爲您在主線程中觀察。你的'fetchItemsFromServer()'以某種方式使用Realm? –

回答

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); 
    } 
} 
+0

上面的代碼不起作用。 I – AndroidEnthusiast

+1

這意味着您可能正在從其他地方得到異常。這段代碼保證只在1個線程上使用Realm實例。 –

+0

我花了更多時間研究這一點,你是對的。我從其他地方獲得了從UI訪問領域的異常。 – AndroidEnthusiast