2016-02-26 4 views
0

Мы пытаемся обработать ошибку, когда я получаю ответ от внешнего. Если ответ успешный, мы начинаем новое действие, с другой стороны, если ответ не увенчался успехом, мы вызываем метод onError.Начало деятельности внутри Rx Subscriber

У нас возникает ощущение, что мы не должным образом управляем жизненным циклом, потому что мы открываем новое мероприятие, наша подписка отменяется, поэтому мы не отменяем диалог должным образом. Следует ли хранить переменную во внутреннем классе абонента, чтобы запросить ее в onComplete, и в этом методе запускается новое действие? Или это аппроксимация достаточно хороша?

Subscriber<BackendResponse> subscriber = new Subscriber<BackendResponse>() { 
     @Override 
     public void onCompleted() { 
      progressDialog.dismiss(); 
     } 

     @Override 
     public void onError(Throwable exception) { 
      progressDialog.dismiss(); 
      SnackbarNotification.show(coordinatorLayout, "Error"); 
     } 

     @Override 
     public void onNext(BackendResponse backendResponse) { 
      if (backendResponse.getSuccess()){ 
       startActivity(new Intent(LoginActivity.this, HomeActivity.class)); 
      } else { 
       onError(new Exception("Launch onError")); 
      } 
     } 
    }; 

Кроме того, правильно ли мы обрабатываем поток onError? Мы знаем, что при вызове onError из onNext он вызывает вызов Error и после этого вызова onComplete. Следует ли отказаться от подписки на метод onError?

Мы нашли оболочку для абонента:

public abstract class DefaultSubscriber<T> extends Subscriber<T> { 
    protected T result; 

    @Override 
    public void onCompleted() { 
     onSuccess(result); 
    } 

    @Override 
    public void onError(Throwable e) { 
     CustomLog.e("onError", e.getMessage()); 
     onFailure(e); 
    } 

    @Override 
    public void onNext(T t) { 
     result = t; 
    } 

    protected abstract void onSuccess(T t); 

    protected abstract void onFailure(Throwable exception); 
} 

Делая так, мы сохраняем результат, предоставленную onNext в переменной-члена. Как только поток будет завершен (только одна итерация), мы вызываем onSuccess (результат) внутри onCompleted. С другой стороны, мы обрабатываем метод onError in onFailure. Что ты об этом думаешь? Мы что-то упускаем?

ответ

2

Так что в первую очередь я не стал бы проверять на backendResponse.getSuccess() в подписчике. Я бы предпочел добавить шаг до него, например. с .flatMap как:

//your observable 
.flatMap(backendResponse - > { 
    if (backendResponse.getSuccess()){ 
    return just(backendResponse); 
    }else{ 
    return Observable.error(new Exception("Launch onError")); 
    } 
}) 

Кроме того, я бы подписываться как:

.flatMap ( ... ) // the flatmap above 
.subscribe(new Subscriber<BackendResponse>() { 
     @Override 
     public void onCompleted() { 
     } 

     @Override 
     public void onError(Throwable exception) { 
      progressDialog.dismiss(); 
      SnackbarNotification.show(coordinatorLayout, "Error"); 
     } 

     @Override 
     public void onNext(BackendResponse backendResponse) { 
      progressDialog.dismiss(); 
      startActivity(new Intent(LoginActivity.this, HomeActivity.class)); 
     } 
    }); 

Would, которые создают глюк или быть то, что вы хотите? Я предположил, что вы получите только одно событие BackendResponse.

Однако, если вам нужно держать свою логику только тогда, когда наблюдаемые завершается, то я вижу два решения:

  • перемещение диалогового окна логики прогресса в вашем HomeActivity
  • продлить жизненный цикл подписки (стараясь не для утечки подписей)
Смежные вопросы