Android"java.lang.RuntimeException:可读取的ParallableClassNotFoundException,读取可序列化的对象" [英] Android "java.lang.RuntimeException: Parcelable encounteredClassNotFoundException reading a Serializable object"

查看:84
本文介绍了Android"java.lang.RuntimeException:可读取的ParallableClassNotFoundException,读取可序列化的对象"的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个Android应用程序,其中添加了一个枚举:

I have an Android application in which I add one more enum:

public enum RootNavigationOption {
    HOME(R.string.home, R.drawable.ic_home), SETTINGS(R.string.settings, R.drawable.ic_settings), LOGOUT(
            R.string.logout_label, R.drawable.ic_logout);

    private int navigationOptionLabelResId;
    private int navigationOptionImageResId;

    private RootNavigationOption(int navigationOptionLabelResId, int navigationOptionImageResId) {

        this.navigationOptionLabelResId = navigationOptionLabelResId;
        this.navigationOptionImageResId = navigationOptionImageResId;
    }

    public int getNavigationOptionLabelResId() {
        return navigationOptionLabelResId;
    }

    public int getNavigationOptionImageResId() {
        return navigationOptionImageResId;
    }

    public static int getValuePosition(RootNavigationOption filterOption) {
        int idx = 0;
        for (RootNavigationOption navigationOptionIter : values()) {
            if (navigationOptionIter.equals(filterOption)) {
                return idx;
            }
            idx++;
        }
        return 0;
    }
}

我放入了这个枚举,并将其放在几个意图包中,以便与我的主要活动进行交流.我的解决方案中已经有一个这样的enum,不会引起任何问题.但是,当我在定义了这个新的enum的情况下运行应用程序时,它立即崩溃:

I put in this enum and placed it in couple of intent bundles for communication to my main activity. I already have one more such enum in my solution, which does not cause any problems. However, when I run my application with this new enum being defined, it immediately crashes with:

 java.lang.RuntimeException: Parcelable encounteredClassNotFoundException reading a Serializable object (name = com.pack1.pack2.pack3.helpers.RootNavigationOption)
    at android.os.Parcel.readSerializable(Parcel.java:2219)
    at android.os.Parcel.readValue(Parcel.java:2064)
    at android.os.Parcel.readArrayMapInternal(Parcel.java:2314)
    at android.os.Bundle.unparcel(Bundle.java:249)
    at android.os.Bundle.getString(Bundle.java:1118)
    at android.app.ActivityOptions.<init>(ActivityOptions.java:310)
    at com.android.server.am.ActivityRecord.updateOptionsLocked(ActivityRecord.java:668)
    at com.android.server.am.ActivityStack.startActivityLocked(ActivityStack.java:1778)
    at com.android.server.am.ActivityStackSupervisor.startActivityUncheckedLocked(ActivityStackSupervisor.java:1769)
    at com.android.server.am.ActivityStackSupervisor.startActivityLocked(ActivityStackSupervisor.java:1249)
    at com.android.server.am.ActivityStackSupervisor.startActivityMayWait(ActivityStackSupervisor.java:741)
    at com.android.server.am.ActivityManagerService.startActivityAsUser(ActivityManagerService.java:3118)
    at com.android.server.am.ActivityManagerService.startActivity(ActivityManagerService.java:3104)
    at android.app.ActivityManagerNative.onTransact(ActivityManagerNative.java:135)
    at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:2071)
    at android.os.Binder.execTransact(Binder.java:404)
    at dalvik.system.NativeStart.run(Native Method)
 Caused by: java.lang.ClassNotFoundException: com.pack1.pack2.pack3.helpers.RootNavigationOption
    at java.lang.Class.classForName(Native Method)
    at java.lang.Class.forName(Class.java:251)
    at java.io.ObjectInputStream.resolveClass(ObjectInputStream.java:2262)
    at java.io.ObjectInputStream.readEnumDescInternal(ObjectInputStream.java:1553)
    at java.io.ObjectInputStream.readEnumDesc(ObjectInputStream.java:1534)
    at java.io.ObjectInputStream.readEnum(ObjectInputStream.java:1579)
    at java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:768)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1981)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1938)
    at android.os.Parcel.readSerializable(Parcel.java:2213)
    ... 16 more
 Caused by: java.lang.NoClassDefFoundError: com/pack1/pack2/pack3/helpers/RootNavigationOption
    ... 26 more
 Caused by: java.lang.ClassNotFoundException: Didn't find class "com.pack1.pack2.pack3.helpers.RootNavigationOption" on path: DexPathList[[directory "."],nativeLibraryDirectories=[/system/lib]]
    at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:497)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:457)
    ... 26 more

我找不到问题的根本原因.我还考虑了以下帖子,但没有任何结果:

I am not able to find the root casue of the problem. I also considered the following posts, without any result:

  • post1 -我没有使用任何cusotmclass加载器.
  • post2 -我直接从ADT,不涉及保镖.
  • post1 - i am not using any cusotmclass loaders.
  • post2 - i am running the application directly from ADT, no proguard involved.

我也有:

  • bin文件夹中检查了我的课程,所需的课程在其中.
  • 用apktool反编译准备好的apk,相应的smali也在那里
  • checked my classes in the bin folder and the needed class is in there.
  • decompiled the ready apk with apktool and the respective smali is in there too

编辑

现在,我可以肯定的是,该异常实际上是由于将枚举值放在用于启动活动的包中而引起的,尽管stacktrace中未提及这些行:

Now I am definitely sure that the exception is actually caused by putting the enum value in a bundle used to start the activity, although these lines are not mentioned in the stacktrace:

Bundle activityOptions = new Bundle();
activityOptions.putSerializable(Constants.VIEW_MODE, RootNavigationOption.HOME);
Intent intent = new Intent(this, MainActivity.class);

我更改了应用程序的逻辑,例如仅在Bundle中不使用此枚举值.作为方法参数,现在可以正常运行.有人知道为什么会发生这种情况吗?

I have changed the logic of my application to not use this enum value in Bundle only e.g. as method parameter and now it runs without any exceptions. Does anyone have a clue why this happens?

由于我更加困惑,我现在也悬赏这个问题.

I also place a bounty on the question now, because I am more perplexed.

推荐答案

使用Enum.ordinal()只是简单地使用枚举序数;此外,这会使您的RootNavigationOption.getValuePosition()过时.

Simply use the enum ordinal as extra using Enum.ordinal(); additionally, this should make your RootNavigationOption.getValuePosition() obsolete.

示例:

final Intent intent = new Intent(this, MainActivity.class);
intent.putExtra(Constants.VIEW_MODE, RootNavigationOption.SETTINGS.ordinal());

稍后在您的MainActivity (或类似名称)中:

Later in your MainActivity (or similar):

final int defaultViewModeOrdinal = RootNavigationOption.HOME.ordinal();
final int viewModeOrdinal = getIntent().getIntExtra(Constants.VIEW_MODE, defaultViewModeOrdinal);
final RootNavigationOption viewMode = RootNavigationOption.values()[viewModeOrdinal];

这篇关于Android"java.lang.RuntimeException:可读取的ParallableClassNotFoundException,读取可序列化的对象"的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆