2017-04-21 1 views
0

RxJava2 Single 내부에서 Throw 된 RuntimeException이 catch되지 않고 관찰자가 삭제 된 경우 Observer의 onError() 메서드로 전송되지 않습니다.
CompositeDisposable.dispose()를 호출하면 내 가입자의 onSuccess 또는 onError 메서드가 호출되지 않지만 예외는 무시되어서는 안된다는 것을 이해합니다. 대신 RuntimeException이 잡히지 않기 때문에 응용 프로그램이 충돌합니다.RuntimeException throw되고 RxJava2에서 catch되지 않음 처분 된 후 단일

여기에 코멘트가있는 줄은 RuntimeException을 던질 수 있습니다. 예외가 .dispose() 메소드를 호출하기 전에 던져지면 잡히고 오류가 구독자에게 전송되지만, .dispose()를 호출 한 후 예외가 발생합니다. 앱이 다운됩니다. 내가 가입

public Single<Submission> getSubmission(final String threadId, final CommentSort sort) { 
     return Single.create(new SingleOnSubscribe<Submission>() { 
      @Override 
      public void subscribe(SingleEmitter<Submission> e) throws Exception { 
       // some irrelevant code 

       try { 
        submission = reddit.getSubmission(sr); // Can throw RuntimeException 
        e.onSuccess(submission); 
       } catch (Exception ex) { 
        e.onError(ex); 
       } 
      } 
     }); 
    } 

코드 :

disposables.add(someCompletable 
       .andThen(service.getSubmission(threadId, CommentSort.HOT)) 
       .subscribeOn(schedulerProvider.io()) 
       .observeOn(schedulerProvider.ui()) 
       .subscribeWith(new DisposableSingleObserver<Submission>() { 
        @Override 
        public void onSuccess(Submission submission) { 
         // Handle result 
        } 

        @Override 
        public void onError(Throwable e) { 
         // Handle error 
        } 
       }) 
     ); 

스택 트레이스 : 답을 찾을 수

E/AndroidRuntime: FATAL EXCEPTION: RxCachedThreadScheduler-2 
Process: com.gmail.jorgegilcavazos.ballislife.debug, PID: 15242 
java.lang.RuntimeException: Unable to parse JSON: [{"kind": "Listing", "data": {"modhash": null, "children": [{"kind": "t3", "data 
at net.dean.jraw.util.JrawUtils.fromString(JrawUtils.java:182) 
at net.dean.jraw.http.RestResponse.<init>(RestResponse.java:64) 
at net.dean.jraw.http.OkHttpAdapter.execute(OkHttpAdapter.java:81) 
at net.dean.jraw.http.RestClient.execute(RestClient.java:120) 
at net.dean.jraw.RedditClient.execute(RedditClient.java:143) 
at net.dean.jraw.RedditClient.execute(RedditClient.java:137) 
at net.dean.jraw.RedditClient.getSubmission(RedditClient.java:287) 
at com.gmail.jorgegilcavazos.ballislife.network.API.RedditService$10.subscribe(RedditService.java:311) 
at io.reactivex.internal.operators.single.SingleCreate.subscribeActual(SingleCreate.java:39) 
at io.reactivex.Single.subscribe(Single.java:2656) 
at io.reactivex.internal.operators.single.SingleDelayWithCompletable$OtherObserver.onComplete(SingleDelayWithCompletable.java:70) 
at io.reactivex.internal.disposables.EmptyDisposable.complete(EmptyDisposable.java:67) 
at io.reactivex.internal.operators.completable.CompletableEmpty.subscribeActual(CompletableEmpty.java:27) 
at io.reactivex.Completable.subscribe(Completable.java:1592) 
at io.reactivex.internal.operators.single.SingleDelayWithCompletable.subscribeActual(SingleDelayWithCompletable.java:36) 
at io.reactivex.Single.subscribe(Single.java:2656) 
+0

'관련성이없는 코드'를 넣지 않았습니까? – pvg

답변

1

: 오류가 손실되지 수 있도록

RxJava이 설계되었습니다. 따라서 시퀀스가 ​​끝나거나 취소되면 이미 터에서 오류를 보내지 않으므로 RxJavaPlugins.onError으로 라우팅됩니다.
1.x와 달리, 2.x는 기본적으로 Thread.currentThread().getUncaughtExceptionHandler().uncaughtException()을 호출하여 Android 앱을 다운시킵니다. 내 경우
Similar stackoverflow question

Source, 가입자는 내가 더 이상 이미 터가 던질 수 있다는 오류에 대한 관심이 없습니다 배치 된, 그래서 이미 터가 onError()를 호출하기 전에이 처리되지 않았 음을 확인해야하기 때문에

관련 문제