Android:Parcelable异常

问题描述 投票:4回答:2

我在生产环境中遇到异常。它与parcelable类有关。但它没有显示哪个类是有问题的。下面是详细的日志跟踪:

Fatal Exception: java.lang.RuntimeException: Unable to start activity ComponentInfo{in.app/in.app.activity.MainActivity}: java.lang.RuntimeException: Parcel android.os.Parcel@ae3c90f: Unmarshalling unknown type code -15962911 at offset 816
   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2957)
   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3032)
   at android.app.ActivityThread.-wrap11(Unknown Source)
   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1696)
   at android.os.Handler.dispatchMessage(Handler.java:105)
   at android.os.Looper.loop(Looper.java:164)
   at android.app.ActivityThread.main(ActivityThread.java:6942)
   at java.lang.reflect.Method.invoke(Method.java)
   at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)

它发生在活动的onStart。我没有将任何可分配的对象传递给活动。它是发射器之一。如何找到指定的哪个parcelable Unmarshalling unknown type code -15962911 at offset 816 另外根据Crashlytics,设备状态如下: 100%接近 3%的应用程序在后台 它发生在多个操作系统版本上。

主要信息

public class MainActivity extends BaseActivity implements CleanUpDelegate,
    OnFilterAppliedListener,
    UpdatePhoneNoDialog.UpdatePhoneNoListener, GoogleApiClient.ConnectionCallbacks,
    GoogleApiClient.OnConnectionFailedListener, GenericDialogOperationListener,
    DAPopupFragment.DAPopupOperationsListener,
    OnLoginListener, HomeScreenFragmentV2.showECOOrderPopup, BottomNavigationRVAdapter.BottomNavigationItemClick

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);
        createBottomNavigation();
    }

    @Override
    protected void onStart() {
        super.onStart();
        if (mGoogleApiClient != null) {
            mGoogleApiClient.connect();
        }
    }
}
android parcelable
2个回答
1
投票

由于它在生产中发生,很可能是因为ProGuard混淆了Parcelable类。

尝试将此包含在ProGuard配置文件中:

-keepclassmembers class * implements android.os.Parcelable {
     static ** CREATOR;
}

有关详细信息,请参阅ProGuard Manual中推荐的Android应用程序配置,并提供有关条目的详细说明。


0
投票

错误:

在偏移XXXXX处解组未知类型代码XXXXX

当你有一个实现Parcelable格式错误的对象时会发生。

public static final Parcelable.Creator<MyClass> CREATOR = new Parcelable.Creator<MyClass>(){

    @Override
    public MyClass createFromParcel(Parcel source){
        // The most common issues are in this constructor.
        return new MyClass(source);
    }

    @Override
    public MyClass[] newArray(int size){
        return new MyClass[size];
    }
}

当您需要重新创建Parcelable对象时,将调用return new MyClass(source);(使用上面的示例)。这是最常见问题发生的地方:

  1. 您有某种类型的变量,并且您将其解组为另一种类型。

示例:您有一个类型为long的变量id,您正在读取它像id = source.readInt();

  1. 您正在尝试读取Parcelable中没有的值。

示例:你尝试id = source.readInt();但你忘了dest.writeInt(id);

  1. 你的Parcelable从另一个也是Parcelable的对象扩展而你忘了在读写方法中调用super。

例:

@Override
public void writeToParcel(Parcel dest, int flags) {
    // This is missing
    super.writeToParcel(dest, flags);
}
  1. 缺少proguard规则:

这将保留所有Parcelable实现的特殊字段:

-keepclassmembers class * implements android.os.Parcelable {
     static ** CREATOR;
}

tl; dr如果没有所有源代码,很难找到问题所在。因此,我向您提出的建议是,检查您在所提及的活动中使用的所有Parcelable对象,并检查它们是否格式正确。

© www.soinside.com 2019 - 2024. All rights reserved.