Man*_*pal 20 android exception unmarshalling parcel parcelable
我们在Play商店记录的崩溃报告中收到此错误.不能在我们所有的测试中复制这个.有没有其他人有同样的问题或解决方案?事实上,我们甚至不知道如何复制这个bug.
所有Parcelable对象都定义了CREATOR,writeToParcel()和contructor.所有列表和复杂类型都被初始化并进行空值检查.
java.lang.RuntimeException: Unable to start activity ComponentInfo{au.com.company/au.com.company.DetailsActivity}: java.lang.RuntimeException: Parcel android.os.Parcel@42d6e270: Unmarshalling unknown type code 6881381 at offset 11268
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2247)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2297)
at android.app.ActivityThread.access$700(ActivityThread.java:152)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1282)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5328)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.RuntimeException: Parcel android.os.Parcel@42d6e270: Unmarshalling unknown type code 6881381 at offset 11268
at android.os.Parcel.readValue(Parcel.java:2032)
at android.os.Parcel.readMapInternal(Parcel.java:2225)
at android.os.Bundle.unparcel(Bundle.java:223)
at android.os.Bundle.getSparseParcelableArray(Bundle.java:1240)
at android.support.v4.app.FragmentManagerImpl.moveToState(SourceFile:861)
at android.support.v4.app.FragmentManagerImpl.moveToState(SourceFile:1104)
at android.support.v4.app.FragmentManagerImpl.moveToState(SourceFile:1086)
at android.support.v4.app.FragmentManagerImpl.dispatchCreate(SourceFile:1872)
at android.support.v4.app.FragmentActivity.onCreate(SourceFile:215)
at android.support.v7.app.ActionBarActivity.onCreate(SourceFile:97)
at au.com.company.DetailsActivity.onCreate(SourceFile:40)
at android.app.Activity.performCreate(Activity.java:5250)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1097)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211)
... 11 more
Run Code Online (Sandbox Code Playgroud)
Ric*_*rdo 22
我遇到了自定义视图的问题,该视图有自己的View.BaseSavedState实现.事实证明,writeToParcel()方法的方法调用顺序错误.
找到问题很烦人,我需要逐步调试Android SDK到Bundle类,其中调用了unparcel():
synchronized void unparcel() {
if (mParcelledData == null) {
return;
}
int N = mParcelledData.readInt();
if (N < 0) {
return;
}
if (mMap == null) {
mMap = new HashMap<String, Object>(N);
}
mParcelledData.readMapInternal(mMap, N, mClassLoader);
mParcelledData.recycle();
mParcelledData = null;
}
Run Code Online (Sandbox Code Playgroud)
日志的第223行正是readMapInternal()调用.在那里,Parcel对象将遍历其项目,逐个读取值.如果以错误的顺序写入某些内容,通常会出现此问题.方法Parcel.readValue(ClassLoader loader)将按照它们编写的顺序读取它们但是如果你有自定义视图或对象,如果它们的编写顺序与你正在阅读它们的顺序不同,那么将会出现错误.下一个要阅读的项目.
所以我通过识别成功读取的最后一个项目找到了问题.您通常可以通过检查其创建者类名来识别(如果它是自定义视图或对象).检查Parcel类的方法readParcelableCreator():
public final <T extends Parcelable> Parcelable.Creator<T> readParcelableCreator(
ClassLoader loader) {
String name = readString();
if (name == null) {
return null;
}
...
}
Run Code Online (Sandbox Code Playgroud)
您可以检查创建者类的名称字符串.如果是自定义的,您可以立即识别它.然后,如果下一次阅读使您的应用程序崩溃,您几乎可以肯定罪魁祸首是之前的阅读.
希望能帮助到你.
我也遇到了这个错误,但我发现了问题.我已将变量从long更改为int但忘记更改以下内容:
我有parcel.writeLong(number),然后读回来number=parcel.readInt().正确的是parcel.writeInt(number).
| 归档时间: |
|
| 查看次数: |
19368 次 |
| 最近记录: |