2015-04-14 3 views
0

Я реализовал POJO так.Как отправить onError, если результат недействителен в RxJava

public class WebResponse<T> { 

    private String Response; 
    private String Message; 
    private T Result; 
} 

В качестве примера, если Response успех, я буду получать массив стран Result.

Для выполнения операций композиции на Country s только I flatMap 'd WebResponse и применил соответствующие операторы. Как так:

Observable<WebResponse<ArrayList<Country>>> countryListAsObservable = api.getCountryListAsObservable(); 
    countryListAsObservable 
      .subscribeOn(AndroidSchedulers.mainThread()) 
      .flatMap(
        new Func1<WebResponse<ArrayList<Country>>, Observable<?>>() { 
         @Override 
         public Observable<Country> call(WebResponse<ArrayList<Country>> arrayListWebResponse) { 

          return Observable.from(arrayListWebResponse.getResult()); 
         } 
        }) 
      .map(new Func1<Country, String>() { 
       @Override 
       public String call(Country country) { 
        return country.getName(); 
       } 
      }) 
      .subscribe(
        new Action1<String>() { 
         @Override 
         public void call(String o) { 
          Log.i("Country name", o); 
         } 
        }); 

Теперь есть шанс, что сам сервер будет посылать сбой, который будет в Response. Когда это произойдет, я хочу вызвать Subscriber s onError().

Как я могу это сделать, не нарушая цепь?

+0

Где она в настоящее время перерыва? – Leon

+0

Служба json, которую я использую в настоящее время, не нарушает. Но если он должен был сломаться, тогда он ломается в 'flatMap', т. Е. Когда он обнаруживает, что' getResult() 'возвращает' null'; – prometheuspk

+0

То, что я имею в виду, это вы протестировали его, чтобы увидеть, что происходит, когда это неправильный результат. BEcause, если я правильно вас понимаю, вы должны проверить ответ, и если это не то, что вы ожидали, поднимите соответствующее исключение – Leon

ответ

4

Вы пробовали что-то вроде кода ниже?

countryListAsObservable.flatMap(new Func1<WebResponse<ArrayList<Country>>, Observable<?>>() { 
    @Override 
    public Observable<Country> call(final WebResponse<ArrayList<Country>> response) { 
     if (!isValidResponse(response)) { 
      return Observable.error(new Exception("Response is invalid")); 
     } else { 
      return Observable.from(response.getResult()); 
     } 
    } 

    public boolean isValidResponse(final WebResponse<ArrayList<Country>> response) { 
     return response != null && response.getResult() != null; 
    } 
}); 

Идея заключается в том, чтобы изменить flatMap функции немного и возвращать Observable.error, если ответ не является действительным.

+0

'Observable.error' - правильный способ сделать это. Я столкнулся с этим оператором, но я подумал, что это просто даст мне ошибку типа возврата для функции flatMap. – prometheuspk

0

Я столкнулся с той же проблемой, прежде чем я отправил null в метод onError (null). Так что я пошел бросить RXJava lib. Внутри RXJava, если мы отправляем null в методе onError, они имеют нулевую проверку и вызывают метод onComplete.

Например: - Так его лучше вместо отправки null.Send NullPointerException («Залп возвращает нуль»)