Android Kotlin-捕获的异常仍使程序崩溃

时间:2019-02-20 06:49:21

标签: android exception mediarecorder failed-installation

代码:

  viewModel.saveLayer.observeNonNull(this) {
        Log.i(TAG, "save layer")
        try {
            // starting to record takes longer than stopping. so, if timed right, a recorder could be stopped
            // before started.
            with(mediaRecorder) {
                stop()
                reset()
            }
            sharedPrefs.updateNumSavedLayers(it)
            viewModel.updateNumSavedLayers(it)
        } catch(e: Exception) {
            Log.e(TAG,"could not save layer", e)
        }
    }

崩溃仍然引发。参见下文:

  

2019-02-20 19:45:22.514 22435-22435 / com.xxx.xxx E / PedalApp:无法保存图层       java.lang.RuntimeException:停止失败。           在android.media.MediaRecorder.stop(本机方法)           在com.androidchekhov.looperpedal.PedalActivity $ onCreate $ 6.invoke(PedalActivity.kt:92)           在com.androidchekhov.looperpedal.PedalActivity $ onCreate $ 6.invoke(PedalActivity.kt:17)           在com.androidchekhov.looperpedal.ExtensionsKt $ observeNonNull $ 1.onChanged(Extensions.kt:9)           在android.arch.lifecycle.LiveData.considerNotify(LiveData.java:109)           在android.arch.lifecycle.LiveData.dispatchingValue(LiveData.java:126)           在android.arch.lifecycle.LiveData.setValue(LiveData.java:282)           在android.arch.lifecycle.MutableLiveData.setValue(MutableLiveData.java:33)           在com.xxx.xxx.PedalViewModel.pedalClick(PedalViewModel.kt:47)           在com.androidchekhov.looperpedal.PedalActivity $ onCreate $ 11.invoke(PedalActivity.kt:137)           在com.androidchekhov.looperpedal.PedalActivity $ onCreate $ 11.invoke(PedalActivity.kt:17)           在com.androidchekhov.looperpedal.OnPedalTouchListener.handleClick(OnPedalListener.kt:80)           在com.androidchekhov.looperpedal.OnPedalTouchListener.onTouch(OnPedalListener.kt:41)           在android.view.View.dispatchTouchEvent(View.java:11775)           在android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2971)           在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2600)           在android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2971)           在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2600)           在android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2971)           在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2600)           在android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2971)           在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2600)           在android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2971)           在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2600)           在android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2971)           在android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2600)           在com.android.internal.policy.DecorView.superDispatchTouchEvent(DecorView.java:448)           在com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1834)           在android.app.Activity.dispatchTouchEvent(Activity.java:3312)           在android.support.v7.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:69)           在com.android.internal.policy.DecorView.dispatchTouchEvent(DecorView.java:410)           在android.view.View.dispatchPointerEvent(View.java:12018)           在android.view.ViewRootImpl $ ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4829)           在android.view.ViewRootImpl $ ViewPostImeInputStage.onProcess(ViewRootImpl.java:4643)           在android.view.ViewRootImpl $ InputStage.deliver(ViewRootImpl.java:4181)           在android.view.ViewRootImpl $ InputStage.onDeliverToNext(ViewRootImpl.java:4234)           在android.view.ViewRootImpl $ InputStage.forward(ViewRootImpl.java:4200)           在android.view.ViewRootImpl $ AsyncInputStage.forward(ViewRootImpl.java:4327)           在android.view.ViewRootImpl $ InputStage.apply(ViewRootImpl.java:4208)           在android.view.ViewRootImpl $ AsyncInputStage.apply(ViewRootImpl.java:4384)           在android.view.ViewRootImpl $ InputStage.deliver(ViewRootImpl.java:4181)           在android.view.ViewRootImpl $ InputStage.onDeliverToNext(ViewRootImpl.java:4234)           在android.view.ViewRootImpl $ InputStage.forward(ViewRootImpl.java:4200)           在android.view.ViewRootImpl $ InputStage.apply(ViewRootImpl.java:4208)           在android.view.ViewRootImpl $ InputStage.deliver(ViewRootImpl.java:4181)           在android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:6755)           在android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:6694)           在android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:6655)           在android.view.ViewRootImpl $ WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:6858)           在android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:193           在android.os.MessageQueue.nativePollOnce(本机方法)

1 个答案:

答案 0 :(得分:1)

不确定我是否误解了您的问题,但以下行表明您看到的异常是由您自己的代码打印的:

Log.e(TAG,"could not save layer", e)

如果您为Log.e命令提供了例外,则该例外会显示在您的消息旁边(请参见documentation):

Send a ERROR log message and log the exception.

请注意,还会显示您的消息“无法保存图层”。因此,您只看到打印的堆栈跟踪,但是正确捕获了异常,因此 not 不会使您的应用程序崩溃。也许是后续问题导致了崩溃。

请(1)在应用程序上提供更多上下文,以及(2)检查您是否可以共享其他崩溃指示器,例如logcat。根据您提供的信息,我认为还会发生另一次崩溃,实际上会导致该应用程序崩溃。

相关问题