2016-03-09 2 views
2

Я хочу сохранить модифицированные ответы на realm на фоновом потоке, а затем передать его в поток пользовательского интерфейса, но его немного сложно, так как Realm очень тронут потоками. так что код будет выглядеть как-то вроде этого, пожалуйста, представить свои изменения во все более эффективные решения :)Как объединить Retrofit 2 с Realm и RxJava

restApi.userRealmList() 
     .doOnNext(userRealmModels -> { 
      if (userRealmModels != null){ 
       mRealm = Realm.getInstance(mContext); 
       mRealm.asObservable() 
         .map(realm -> mRealm.copyToRealmOrUpdate(userEntity)) 
         .subscribe(new Subscriber<Object>() { 
          @Override 
          public void onCompleted() { 

          } 

          @Override 
          public void onError(Throwable e) { 
           e.printStackTrace(); 
          } 

          @Override 
          public void onNext(Object o) { 
           Log.d("RealmManager", "user added!"); 
          } 
         }); 
      }}) 
     .map(userEntityDataMapper::transformAll) 
     .subscribeOn(Schedulers.io()) 
     .observeOn(AndroidSchedulers.mainThread()) 
     .subscribe(new Subscriber<List<User>>() { 
      @Override 
      public void onCompleted() { 
       hideViewLoading(); 
      } 

      @Override 
      public void onError(Throwable e) { 
       hideViewLoading(); 
       showErrorMessage(new DefaultErrorBundle((Exception) e)); 
       showViewRetry(); 
      } 

      @Override 
      public void onNext(List<User> users) { 
       showUsersCollectionInView(users); 
      } 
     }); 

ответ

4

Вы код не выглядит, как он может скомпилировать? Например. Что такое userEntity. Кроме того, ваш copyToRealmOrUpdate не находится внутри транзакции, поэтому он также будет аварийно завершен, но он не имеет ничего общего с потоками.

Если вы хотите сохранить некоторые данные в качестве побочного эффекта перед его отправкой в ​​пользовательский интерфейс, вы должны быть в состоянии сделать следующее:

restApi.userRealmList() 
     .doOnNext(userRealmModels -> { 
      if (userRealmModels != null) { 
       Realm realm = Realm.getInstance(mContext); 
       realm.beginTransaction(); 
       realm.copyToRealmOrUpdate(userRealmModels); 
       realm.commitTransaction(); 
       realm.close(); 
      }}) 
     .map(userEntityDataMapper::transformAll) 
     .subscribeOn(Schedulers.io()) 
     .observeOn(AndroidSchedulers.mainThread()) 
     .subscribe(new Subscriber<List<User>>() { 
      @Override 
      public void onCompleted() { 
       hideViewLoading(); 
      } 

      @Override 
      public void onError(Throwable e) { 
       hideViewLoading(); 
       showErrorMessage(new DefaultErrorBundle((Exception) e)); 
       showViewRetry(); 
      } 

      @Override 
      public void onNext(List<User> users) { 
       showUsersCollectionInView(users); 
      } 
     }); 
Смежные вопросы