2016-08-18 6 views
0

최근에 우리 앱에서 다음과 같은 몇 가지 예외가 발생했습니다 :Xamarin Android - 활동을 시작할 수 없습니다. ComponentInfo {[activityName]} : java.lang.RuntimeException : Parcel android.os.Parcel @ [address]

java.lang.RuntimeException가 : java.lang.RuntimeException가 : 소포 [email protected] : 비 정렬 화 활동 ComponentInfo {com.myapp.android/com.myapp.android.WelcomeActivity}을 (를) 시작할 수 없습니다 알 수없는 형식 코드 2131558952 at offset 736 at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2429) at android.app.Ac android.os에서 android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1283) 에서 tivityThread.handleLaunchActivity (ActivityThread.java:2493) android.app.ActivityThread.access $ 800 (ActivityThread.java:166)에서 .Handler.dispatchMessage (Handler.java:102) at android.os.Looper.loop (Looper.java:136) at android.app.ActivityThread.main (ActivityThread.java:5584) at java.lang.reflect .Method.invokeNative (네이티브 메소드) at java.lang.reflect.Method.invoke (Method.java:515) at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:1268) at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1084) at dalvik.system.NativeStart.main (네이티브 메서드) 원인 : java.lang.RuntimeException가 : 소포 [email protected] :에서 android.os.Parcel.readSparseArrayInternal에서 android.os.Parcel.readValue (Parcel.java:2087)에서 736 오프셋 2131558952 비 정렬 화 알 수없는 형태 코드 (Parcel.java:2382) at android.os.Parcel.readSparseArray (Parcel.java:1742) at android.os.Parcel.readValue (Parcel.java:2077) android.os.Parcel.readArrayMapInternal (Parcel .java : 2321) at android.os.Bundle.unparcel (Bundle.java:249) at android.os.Bundle.getSparseParcelableArray (Bundle.java:1273) at com.android.internal.policy.impl.PhoneWindow .restoreHierarchyState (PhoneWindow.java:1884) android.app.Activity.onRestoreInstanceStat android.app에서 E android.app.Instrumentation.callActivityOnRestoreInstanceState (Instrumentation.java:1145)에서 android.app.Activity.performRestoreInstanceState (Activity.java:961)에서 (Activity.java:989)

.ActivityThread.performLaunchActivity (ActivityThread.java:2407) 는 ...

보다 11 내 활동을 확인하지만 Parcelable 물건에 관련된 아무것도 없다. 그래서 더 많이 파고 가서 활동에 사용되는 위젯 중 하나에서 Parcelable 코드를 발견했습니다. 나는이 문제를 재현 할 개인적 없었습니다하지만이 https://github.com/xamarin/monodroid-samples/blob/master/ViewPagerIndicator/ViewPagerIndicator/Library/CirclePageIndicator.cs

:

protected override void OnRestoreInstanceState(IParcelable state) 
     { 
      try 
      { 
       SavedState savedState = (SavedState)state; 
       base.OnRestoreInstanceState(savedState.SuperState); 
       mCurrentPage = savedState.CurrentPage; 
       mSnapPage = savedState.CurrentPage; 
      } 
      catch 
      { 
       base.OnRestoreInstanceState(state); 
       // Ignore, this needs to support IParcelable... 
      } 
      RequestLayout(); 
     } 

     protected override IParcelable OnSaveInstanceState() 
     { 
      var superState = base.OnSaveInstanceState(); 
      var savedState = new SavedState(superState) 
      { 
       CurrentPage = mCurrentPage 
      }; 
      return savedState; 
     } 

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

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

      private SavedState(Parcel parcel) : base(parcel) 
      { 
       CurrentPage = parcel.ReadInt(); 
      } 

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

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

      private 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 Object[size]; 
       } 
      } 
     } 

코드는 실제로 여기에이 예에서 찍은 : 나는 그것이 다음 코드에 의해 야기 될 수 있음을 매우 높은 의심을 우리의 앱에 대한 충돌보고에서 나옵니다.

이 정보에 대한 조언을 보내 주시면 감사하겠습니다.

답변

0

모든 창조자의 물건을 제거하고 기본 고수에 의해 고정 :

protected override void OnRestoreInstanceState(IParcelable state) 
     { 
      var bundle = state as Bundle; 
      if (bundle != null) 
      { 
       mCurrentPage = bundle.GetInt("currentPage", 0); 
       mSnapPage = mCurrentPage; 
       state = (IParcelable)bundle.GetParcelable("superState"); 
      } 
      base.OnRestoreInstanceState(state); 
      RequestLayout(); 
     } 

     protected override IParcelable OnSaveInstanceState() 
     { 
      var bundle = new Bundle(); 
      bundle.PutParcelable("superState", base.OnSaveInstanceState()); 
      bundle.PutInt("currentPage", mCurrentPage); 
      return bundle; 
     }