2016-02-22 12 views
3

Я пытаюсь понять, как лучше всего обращаться с конкретным случаем, используя RxJava.Обработка обратных вызовов с помощью RxJava

Мне нужно вернуть Observable, который обрабатывает удаление учетной записи с Android AccountManager. К сожалению, это действие является асинхронным и требует обратного вызова для обработки результата.

Из-за этого, я использую метод Observable.create, таким образом:

return Observable.create(subscriber -> { 
     final Account account = getAccountIfExist(); 
     if (account == null) { 
      subscriber.onError(new NoUserFoundException()); 
      return; 
     } 

     accountManager.removeAccount(account, future -> { 
      boolean result = false; 
      try { 
       result = future.getResult(); 
      } catch (Exception ex) { 
       Log.e(TAG, "Remove account not successful : ", ex); 
       subscriber.onError(ex); 
       return; 
      } 

      if (result) { 
       subscriber.onNext(account.name); 
       subscriber.onCompleted(); 
      } else { 
       subscriber.onError(new RuntimeException("Cannot remove the account.")); 
      } 
     }, null); 
    }); 

Но, Observable.create имеет различные проблемы, касающиеся противодавление и отмены, как указано в этом post

Итак, вопрос есть, как я могу использовать Observable.fromCallable (или эквивалентный метод) для обработки обратных вызовов (в общем), а также для устранения противодавления и отмены?

ответ

1

Вы можете попробовать использовать

Observable.defer

return Observable.defer(() -> { 
    final Account account = getAccountIfExist(); 
     if (account == null) { 
      return Observable.error(new NoUserFoundException()); 
     } 
accountManager.removeAccount(account, future -> { 
      boolean result = false; 
      try { 
       result = future.getResult(); 
      } catch (Exception ex) { 
       return Observable.error(ex); 
      } 

      if (result) { 
       Observable.just(account.name); 
      } else { 
       return Observable.error(new NoUserFoundException("Cannot remove the account.")) 
      } 
     }, null); 
}); 
Смежные вопросы