2017-08-02 50 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是好的。 但是,如果我訂閱,然後取消訂閱異常沒有被捕獲,應用程序崩潰。 除了在onSubscribe中發送消息外,RxJava包裝器不執行任何工作。

任何暗示,它怎麼可能?

堆棧跟蹤:

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

你在哪裏創建你的'Handler'?用什麼參數?你可能使用'HandlerThread'嗎? – pskink

+0

不,它不是'HandlerThread'。這只是'Thread'我也是在'Thread'構造函數和循環中創建它的。 –

+0

那它看起來像什麼? – pskink

回答

0

我發現了一個問題。將RxJava更新到最新版本(2.1.2)後,堆棧跟蹤變得更加明顯。我意識到,即使發現異常,我在我的可觀察值上調用onError,但我實際上存儲在catch塊中(代碼未在此處顯示)。

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(
相關問題