2017-08-02 18 views
0

状況は非常に複雑ですが、私はそれを説明しようとします。 (コードは実際のアプリケーションから簡略化されています)ハンドラメッセージに例外がキャッチされない

私はルーパー付きのカスタムスレッド上にハンドラを持っています。 私はそれにメッセージを送信:

... 
handler.obtainMessage(...) 
    .sendToTarget(); 
... 

ハンドラは、メッセージ・コールバックを持っています

private final Handler.Callback callback = new Handler.Callback() { 
    public boolean handleMessage(Message msg) { 
      try { 
       //The hard work is here 
       SystemClock.sleep(5000) 
       throw new CustomException(); 
      } catch (CustomException e) { 

      } 
      //... 
      //Sending the result back to the UI thread here. 
      //... 
     } 
     return true; 
    } 
}; 

私はこのメッセージを送る上RxJavaラッパーを持っています。

私が購読しているのなら、everythigは大丈夫です。 しかし、もし私がサブスクライブするなら、例外を捕捉せずにアプリケーションをクラッシュしてください。 RxJavaラッパーは、onSubscribeでメッセージを送信する以外は何もしません。

どのようなsuggesions、どのように可能ですか?

スタックトレース:

08-01 10:02:58.422 13655-13655/com.mycompany.myapp E/AndroidRuntime: FATAL EXCEPTION: main 
                     Process: com.mycompany.myapp, PID: 13655 
                     com.mycompany.myapp.util.CustomException 
                      com.mycompany.myapp.util.LooperThread$1.handleMessage(LooperThread.java:33) 
                      at android.os.Handler.dispatchMessage(Handler.java:98) 
                      at android.os.Looper.loop(Looper.java:173) 
                      at com.mycompany.myapp.util.neulion.LooperThread.run(LooperThread.java:57) 
+0

ここで、「ハンドラ」を作成しますか?どのようなパラメータで?おそらく 'HandlerThread'を使っていますか? – pskink

+0

いいえ、それは 'HandlerThread'ではありません。それはちょうど 'スレッド'私は 'スレッド'コンストラクタでそれを作成し、またルーペです。 –

+0

だから、どうなっていますか? – pskink

答えて

0

は私が問題を発見しました。 RxJavaを最新バージョン(2.1.2)にアップデートした後、スタックトレースがより明確になりました。そして、たとえ例外がキャッチされたとしても、実際にはcatchブロック(コードはここには表示されていません)に格納されていることを除いて、私はobservableにonErrorを呼び出します。

08-03 10:53:25.811 6822-6822/com.mycompany.myapp E/AndroidRuntime: FATAL EXCEPTION: main 
    Process: com.mycompany.myapp, PID: 6822 
    io.reactivex.exceptions.UndeliverableException: java.lang.Exception: My exception 
     at io.reactivex.plugins.RxJavaPlugins.onError(RxJavaPlugins.java:349) 
     at io.reactivex.internal.operators.observable.ObservableCreate$CreateEmitter.onError(ObservableCreate.java:74) 
     at com.mycompany.myapp.ui.screen.video.RxNeulion$1$1.onFailure(RxNeulion.java:29) 
     at com.mycompany.myapp.util.neulion.Neulion$Callback.run(Neulion.java:59) 
     at android.os.Handler.handleCallback(Handler.java:739) 
     at android.os.Handler.dispatchMessage(Handler.java:95) 
     at android.os.Looper.loop(Looper.java:148) 
     at android.app.ActivityThread.main(ActivityThread.java:7303) 
     at java.lang.reflect.Method.invoke(Native Method) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 
    Caused by: java.lang.Exception: My exception 
     at com.mycompany.myapp.util.neulion.MyHandlerCb.handleMessage(MyHandlerCb.java:27) 
     at android.os.Handler.dispatchMessage(Handler.java:98) 
     at android.os.Looper.loop(Looper.java:148) 
     at com.mycompany.myapp.util.neulion.LooperThread.run(
関連する問題