2

Я пытаюсь привыкнуть к rxjava, и я пытаюсь позвонить ниже QuoteReader в Наблюдаемый. Я не уверен, как обрабатывать исключение брошено,Обработка исключений в rxjava

public class QuoteReader { 
    public Map<String, Object> getQuote() throws IOException{ 
     OkHttpClient okHttpClient = new OkHttpClient(); 
     Request request = new Request.Builder().url("http://quotes.rest/qod.json").build(); 
     Gson gson = new Gson(); 
     Map<String, Object> responseMap = null; 

     try(Response response = okHttpClient.newCall(request).execute()) { 
     responseMap = gson.fromJson(response.body().string(), Map.class); 
     System.out.println("response map : "+responseMap); 
     } catch(IOException ioe) { 
     ioe.printStackTrace(); 
     throw ioe; 
     } finally { 
     okHttpClient = null; 
     request = null; 
     } 
    return responseMap; 
    } 
} 

Ниже приведен ге коды, который я пытаюсь написать,

rx.Observable.just(new QuoteReader().getQuote()) //compile time error saying unhandled exception 
       .subscribe(System.out::println); 

Как я должен обновить код для обработки исключений. Благодаря!

+0

Вы должны либо обернуть код в блок try/catch, либо объявить, что ваш метод выдает исключение. –

ответ

7

Используйте fromCallable, что позволяет ваш метод бросить (плюс, он получает оценку лениво и не раньше, чем вы даже попасть в наблюдаемом мире):

rx.Observable.fromCallable(() -> new QuoteReader().getQuote()) 
      .subscribe(System.out::println, Throwable::printStackTrace); 
0

Существует еще один заводской метод для Observable, который называется create. Это дает вам Observer как входное выражение лямбда-выражения. Observer является своего рода объектом обратного вызова тремя способами: onNext(T t), onError(Throwable e) и onCompleted. Я читал, что вы новичок в RxJava, поэтому здесь немного больше, как побочный код: контракт Rx указывает, что Observer может получать ноль или более onNext звонков, а затем может быть либо onError, либо onCompleted. В регулярном выражении это выглядит так: onNext* (onError|onCompleted)?.

Теперь, когда вы знаете это, вы можете реализовать операцию с использованием Observable.create:

Observable.create(observer -> { 
    try { 
    observer.onNext(new QuoteReader.getQuote()); 
    observer.onCompleted(); 
    } 
    catch (Throwable e) { 
    observer.onError(e); 
    } 
} 

Обратите внимание, что этот код ничего не делает, пока вы не подписаться на этот Observable как вы уже делали в вашем вопросе!

0

Наблюдаемый трубопровод не позволяет вам выбрасывать исключения. Вы должны использовать runtimeExceptions. Поэтому, изменяя свой код, он должен выглядеть.

 try(Response response = okHttpClient.newCall(request).execute()) { 
     responseMap = gson.fromJson(response.body().string(), Map.class); 
     System.out.println("response map : "+responseMap); 
    } catch(IOException ioe) { 
    ioe.printStackTrace(); 
    new RuntimeException(ioe); 

Вы можете увидеть практический пример здесь https://github.com/politrons/reactive/blob/master/src/test/java/rx/observables/errors/ObservableExceptions.java

+0

github link throws a 404 –

+0

@ g0c00l.g33k Я обновляю ссылку – paul

Смежные вопросы