2016-08-18 22 views
0

最近、アプリで次のような例外がいくつか発生しています:Xamarin Android - アクティビティを開始できませんComponentInfo {[activityName]}:java.lang.RuntimeException:Parcel android.os.Parcel @ [address]

java.lang.RuntimeException:活性 ComponentInfo {com.myapp.android/com.myapp.android.WelcomeActivity}を開始できません: java.lang.RuntimeException:パーセル[email protected]: アンマーシャリング不明なタイプのコード2131558952 at offset 736 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2429) at android.app.Ac tivityThread.handleLaunchActivity(ActivityThread.java:2493) android.app.ActivityThread.access $ 800(ActivityThread.java:166)at android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1283) とandroid.osで.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 アンマーシャリング未知の型コード android.os.Parcel.readArrayMapInternalでandroid.os.Parcel.readValue(Parcel.java:2077)で android.os.Parcel.readSparseArray(Parcel.java:1742)で(Parcel.java:2382)(パーセル.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 AT 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ものに関連するものは何もありません。だから私はもっと掘って、アクティビティで使用されている私たちのウィジェットの1つに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; 
     } 
関連する問題