Rx2 Java, потребительский интерфейс не обрабатывает ошибку (время ожидания сокета).Приложение вылетает - PullRequest
0 голосов
/ 14 мая 2019

У меня есть следующий подписчик для регистрации принятия от поставщика услуг http, но когда URL-адрес искажен, я получаю исключение, которое невозможно отловить, как показано ниже, то есть try-catch не работает.(Когда URL-адрес действителен, никаких проблем).

Как мне сделать этот водонепроницаемый?Я хочу получить "onError", но это не является частью интерфейса Consumer.В данный момент приложение вылетает при этом событии ошибки.Возможно, лучше / проще использовать Http напрямую, а не RX?

try {
            someApi.setStationInfo(stationInfo)
                    .subscribeOn(Schedulers.io())
                    .observeOn(Schedulers.newThread())
                    .subscribe(new Consumer<StationInfo>() {
                        @Override
                        public void accept(StationInfo abi) throws Exception {

                                                            System.out.println("TestAppZappPc received accept from endpoint, data: " + abi);
                        }
                    });
        } catch (Exception e) {
            e.printStackTrace();
        }

ИСКЛЮЧЕНИЕ:

io.reactivex.exceptions.OnErrorNotImplementedException: время ожидания соединения в io.reactivex.internal.functions.Functions $ OnErrorMissingConsumer.accept (Functions.java:704) в io.reactivex.internal.functions.Functions $ OnErrorMissingConsumer.accept (Functions.java:701) в io.reactivex.internal.observers.LambdaEbserver.java: 77) в io.reactivex.internal.operators.observable.ObservableObserveOn $ ObserveOnObserver.checkTeridity (ObservableObserveOn.java:276) в io.reactivex.internal.operators.observable.ObservableObserveOnbObOnObObOOO) в io.reactivex.internal.operators.observable.ObservableObserveOn $ ObserveOnObserver.run (ObservableObserveOn.java:252) в io.reactivex.internal.schedulers.ScheduledRunnable.run (ScheduledRunnable.jternalre at at io.schedulers.ScheduledRunnable.call (ScheduledRunnable.java:52) в java.util.concurrent.FutureTask.run (FutureTask.java:237) в java.util.concurrent.ScheduledThreadPoolExecutor $ ScheduledFutureTask.run (ScheduledThreadPoolExecutor.java:272) в java.utilExolorPecur.java: 1133) в java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:607) в java.lang.Thread.run (Thread.java:761). Причина: исключение java.net.SocketTimeoutException: время соединенияна java.net.PlainSocketImpl.socketConnect (собственный метод) на java.net.AbstractPlainSocketImpl.doConnect (AbstractPlainSocketImpl.java:334) на java.net.AbstractPlainSocketImpl.connectToAddress (AbstractPlainSocketIl.Amp.j.Ab.подключиться (AbstractPlainSocketImpl.java:178) в java.net.SocksSocketImpl.connect (SocksSocketImpl.java:356) в java.net.Socket.connect (Socket.java:586) в okhttp3.internal.platform.AndroidPlatform.connectScket.java: 71) по адресу okhttp3.internal.connection.RealConnection.connectSocket (RealConnection.java:240) в okhttp3.internal.connection.RealConnection.connect (RealConnection.java:160) в okhttp3.internal.connection.StreamAllocation.findConnection (StreamAllocation.java:257) в okhttp.internal.connection.find(StreamAllocation.java:135) в okhttp3.internal.connection.StreamAllocation.newStream (StreamAllocation.java:114) в okhttp3.internal.connection.ConnectInterceptor.intercept (ConnectInterceptor.java:42) в okhttp3.internal.orp.продолжить (RealInterceptorChain.java:147) по адресу okhttp3.internal.http.RealInterceptorChain.proceed (RealInterceptorChain.java:121) по адресу okhttp3.internal.cache.CacheInterceptor.intercept (CacheInterceptor.java:93.seter.hinter.proceed (RealInterceptorChain.java:147) в okhttp3.internal.http.RealInterceptorChain.proceed (RealInterceptorChain.java:121) в okhttp3.internal.http.BridgeInterceptor.intercept (BridgeInterceptor.javattp. at. at. at. at. at93)RealInterceptorChain.proceed (RealInterceptorChain.java:147) в okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept (RetryAndFollowUpInterceptor.java:126) в okhttp3.internal.http.RealInteravaorha (Realceptor) (7)в okhttp3.internal.http.RealInterceptorChain.proceed (RealInterceptorChain.java:121) в okhttp3.logging.HttpLoggingInterceptor.intercept (HttpLoggingInterceptor.java:213) в okhttp3.internal.htxtorokhttp3.internal.http.RealInterceptorChain.proceed (RealInterceptorChain.java:121) в okhttp3.RealCall.getResponseWithInterceptorChain (RealCall.java:200) в okhttp3.RealCall.execute (RealCallPHT)..java: 174) на com.jakewharton.retrofit2.adapter.rxjava2.CallObservable.subscribeActual (CallObservable.java:41) на io.reactivex.Observable.subscribe (Observable.java:10955) на com.jakewharton.retrofit2.adrxjava2.BodyObservable.subscribeActual (BodyObservable.java:34) 2019-05-14 11: 41: 44.728 31475-32204 / com.hdsl.a.zapp E / AndroidRuntime: at io.reactivex.Observable.subscribe (Observable.java:10955) на io.reactivex.internal.operators.observable.ObservableSubscribeOn $ SubscribeTask.run (ObservableSubscribeOn.java:96) в io.reactivex.Scheduler $ DisposeTask.run (Scheduler.java:452) ... еще 7

1 Ответ

1 голос
/ 14 мая 2019

Есть два способа справиться с этим.

  1. Использовать версию с двумя параметрами subscribe: subscribe(Consumer<? super T> onNext, Consumer<? super Throwable> onError).2-й Consumer будет вызван, когда возникнет исключение
  2. обработать его в строке:
someApi.setStationInfo(stationInfo)
       .subscribeOn(Schedulers.io())
       .observeOn(Schedulers.newThread())
       .toMaybe()
       .onErrorComplete(any -> true)
       .subscribe(abi ->                                                             
            System.out.println("TestAppZappPc received accept from endpoint, data: "
                 + abi)
       );
...