2014-09-28 3 views
0

Xamarin Android를 사용하여 Android 애플리케이션을 개발하고 있습니다.Xamarin Android 안타깝게도 앱이 중지되었습니다

나는 여전히 다양한 장치에 자주 "불행하게도 앱이 중지 오류"를 수신하고있어

AndroidEnvironment.UnhandledExceptionRaiser += (sender, args) => 
            { 
               //WRITE TO FILE 
            }; 
            AppDomain.CurrentDomain.UnhandledException += (s, e) => 
            { 
                /* 
                 * When a background thread crashes this is the code that will be executed. You can 
                 * recover from this. 
                 */ 
            }; 

을 통해 글로벌 예외를 잡으려고 노력하고있어. 오류가 발견되지 않았습니다.

메모리 누수가 의심되지만 확실하지 않습니다. 이 오류가 자주 제기되는 장치의 logcat 파일에 액세스 할 수 없습니다. 나는 끝내 준다. 누군가가 같은 것을 밝힐 수 있을까요? 글로벌 예외가 발생하고 잡은 경우 보조 노트에

이는 UnhandledExceptionRaiser는 (I 추측이 때문에 안드로이드 과정을 청소하다?) 사이에 중단하고 파일에 기록되지 않습니다

+0

게시하시기 바랍니다 로그 캣. –

+0

@MysticMagic은 당신도 질문을 읽나요? –

+0

예. 나는 읽었다. 내가 읽어도 "오류, 그 c가 아니다. 알았어. "하지만 그건 우리를 돕는 데 도움이되지 않을거야.그럼 어떤 방법이든 행운을 빈다. :) –

답변

3

Google 크래시 보고서를 분석 한 후 실제 오류가 발견되었습니다.

11-12 22:36:31.410: E/AndroidRuntime(4835): FATAL EXCEPTION: main 
11-12 22:36:31.410: E/AndroidRuntime(4835): java.lang.RuntimeException: Unable to start activity 
ComponentInfo{com.apptimator.pro.mayusha/com.apptimator.mayusha.HomeActivity}: java.lang.RuntimeException: Parcel [email protected]: Unmarshalling unknown type code 7209057 at offset 1064 

...... 
11-12 22:36:31.410: E/AndroidRuntime(4835): Caused by: java.lang.RuntimeException: Parcel [email protected]: Unmarshalling unknown type code 7209057 at offset 1064 
11-12 22:36:31.410: E/AndroidRuntime(4835):  at android.os.Parcel.readValue(Parcel.java:2038) 
11-12 22:36:31.410: E/AndroidRuntime(4835):  at android.os.Parcel.readMapInternal(Parcel.java:2255) 
11-12 22:36:31.410: E/AndroidRuntime(4835):  at android.os.Bundle.unparcel(Bundle.java:223) 
11-12 22:36:31.410: E/AndroidRuntime(4835):  at android.os.Bundle.getSparseParcelableArray(Bundle.java:1237) 
11-12 22:36:31.410: E/AndroidRuntime(4835):  at com.android.internal.policy.impl.PhoneWindow.restoreHierarchyState(PhoneWindow.java:1969) 
11-12 22:36:31.410: E/AndroidRuntime(4835):  at android.app.Activity.onRestoreInstanceState(Activity.java:977) 
11-12 22:36:31.410: E/AndroidRuntime(4835):  at android.app.Activity.performRestoreInstanceState(Activity.java:949) 
11-12 22:36:31.410: E/AndroidRuntime(4835):  at android.app.Instrumentation.callActivityOnRestoreInstanceState(Instrumentation.java:1155) 
11-12 22:36:31.410: E/AndroidRuntime(4835):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2271) 

이 오류

상태 구현 저장 중첩에 의한 저장 인스턴스 상태를 복원 안드로이드 실패에 의해 어느 this ("Proguard Causing Runtime exception") 또는이 자 마린 안드로이드의 경우에 발생할 수 있습니다.

내가 SlidingMenuSharp을 사용했다

(IParcelable를 구현하고 중첩 된 SavedState 클래스를 사용하여 한 집 활동에 SlidingMenuSharp link) 라이브러리. 같은 오류가 발견 될 수 here

그럼에도 불구하고, 나는 그 모든 이제 제대로 작동을 해결하기 위해 관리.에 오류를 수정, SavedState, OnRestoreInstanceState 및 OnSaveInstanceState에 대한 언급 번들 구현을 따르십시오

public class SavedState : BaseSavedState 
    { 
     public int Item { get; private set; } 

     public SavedState(IParcelable superState) 
      : base(superState) 
     { 

     } 

     public SavedState(Parcel parcel) 
      : base(parcel) 
     { 
      Item = parcel.ReadInt(); 
     } 

     public override void WriteToParcel(Parcel dest, ParcelableWriteFlags flags) 
     { 
      base.WriteToParcel(dest, flags); 
      dest.WriteInt(Item); 
     } 

     [ExportField("CREATOR")] 
     static SavedStateCreator InitializeCreator() 
     { 
      return new SavedStateCreator(); 
     } 

     class SavedStateCreator : Java.Lang.Object, IParcelableCreator 
     { 
      public Java.Lang.Object CreateFromParcel(Parcel source) 
      { 
       return new SavedState(source); 
      } 

      public Java.Lang.Object[] NewArray(int size) 
      { 
       return new SavedState[size]; 
      } 
     } 
    } 

    protected override void OnRestoreInstanceState(IParcelable state) 
    { 
     try 
     { 
      Bundle bundle = state as Bundle; 
      if (bundle != null) 
      { 
       IParcelable superState = (IParcelable)bundle.GetParcelable("base"); 
       if (superState != null) 
        base.OnRestoreInstanceState(superState); 
       _viewAbove.SetCurrentItem(bundle.GetInt("currentPosition", 0)); 
      } 
     } 
     catch 
     { 
      base.OnRestoreInstanceState(state); 
      // Ignore, this needs to support IParcelable... 
     } 
    } 

    protected override IParcelable OnSaveInstanceState() 
    { 
     var superState = base.OnSaveInstanceState(); 
     Bundle state = new Bundle(); 
     state.PutParcelable("base", superState); 
     state.PutInt("currentPosition", _viewAbove.GetCurrentItem()); 

     return state; 
    } 
+0

이것은 Xamarin 샘플의 CirclePageIndicator에도 적용됩니다. "Unmarshalling unknown type code"에서 OnRestoreInstanceState 및 OnSaveInstanceState 구현이 작동합니다. 접근 방식은 – rouen

+0

입니다. @rouen 그들에게보고하십시오/pull 요청을 만드십시오 :) –

+0

이 솔루션을보고 나면 나를 위해 문제를 해결 한 장치를 다시 시작해야한다는 것을 깨달았습니다. 같은 문제인지 확실하지 않습니다. –

0

당신은해야

참고 :이 아닌 자 마린 docs에서 언급 한 바와 같이, 처리되지 않은 예외를 차단하는 방법으로 AppDomain.CurrentDomain.UnhandledException를 사용하는 당신은 관리 예외 MonoDroid에서 결코 처리되지 않은 있습니다로 AppDomain.UnhandledException 이벤트에 의존 할 수 없다; 항상 은 catch (Exception) 블록 내의 Android/관리 경계에서 차단됩니다.

계속해서 AndroidEnvironment.UnhandledExceptionRaiser을 계속 사용하고 가능한 한 효율적으로 작동하는 것이 좋습니다.

배경 스레드에서 발생하고 관찰되지 않는 예외 (처리되지 않은 예외는 발생하지 않음)는 TaskScheduler.UnobservedTaskException으로 catch 할 수 있습니다.

마지막으로, 내 응용 프로그램 클래스 (Android.App.Application에서 상속 한 클래스)의 예외 처리 이벤트를 모두 구독합니다. 응용 프로그램의 첫 번째 진입 점이기 때문에 예외를 처리 할 수 ​​있습니다. 활동 시작 (또는 지금부터 구독하는 모든 곳)

PS 나는 또한 안전 측면에 있기 위해서 TaskScheduler.UnobservedTaskException을 사용하지만 결코 그것으로 어떤 예외도 잡지 않았다.

+0

내 Application 클래스에서 AndroidEnvironment.UnhandledExceptionRaiser를 사용하고 있습니다. 그리고 방금 AppDomain.CurrentDomain.UnhandledException을 안전한 곳에 두었습니다. –

관련 문제