android - 在 Bundle 中传递对象 - ClassNotFoundException

标签 android android-activity bundle classnotfoundexception

我在将自定义类传递给另一个 Activity 时遇到问题,导致 Activity 管理器崩溃。我有这样一个类:

public class MyClass implements Serializable/Parcelable {
    public final String a;
    public final Long b;
    public final Boolean c;
}


Intent intent = new Intent(getActivity(), TargetActivity.class);
Bundle parameter = new Bundle();
parameter.putParcelable(TargetActivity.DATA_KEY, instance_of_my_class);
startActivity(intent, parameter);

我已经尝试了 SerializableParcelable 两种方法都失败了,并出现了同样的问题:ClassNotFoundException

有一些关于此的旧讨论,其中推荐使用 setClassLoadersetExtrasClassLoader,不幸的是它不起作用。例如,我尝试了 parameter.setClassLoader(getClass().getClassLoader()); 结果是一样的。

有人知道解决办法吗?第三方图书馆是否有可能对此产生影响? (我项目中有EventBus)

Parcelable 案例中的堆栈跟踪如下所示:

08-23 14:40:37.086 1487-1783/system_process E/Parcel: Class not found when unmarshalling: com.example.MyClass
                                                  java.lang.ClassNotFoundException: com.example.MyClass
                                                      at java.lang.Class.classForName(Native Method)
                                                      at java.lang.Class.forName(Class.java:309)
                                                      at java.lang.Class.forName(Class.java:273)
                                                      at android.os.Parcel.readParcelableCreator(Parcel.java:2281)
                                                      at android.os.Parcel.readParcelable(Parcel.java:2245)
                                                      at android.os.Parcel.readValue(Parcel.java:2152)
                                                      at android.os.Parcel.readArrayMapInternal(Parcel.java:2485)
                                                      at android.os.BaseBundle.unparcel(BaseBundle.java:221)
                                                      at android.os.BaseBundle.getString(BaseBundle.java:918)
                                                      at android.app.ActivityOptions.<init>(ActivityOptions.java:570)
                                                      at com.android.server.am.ActivityRecord.<init>(ActivityRecord.java:417)
                                                      at com.android.server.am.ActivityStackSupervisor.startActivityLocked(ActivityStackSupervisor.java:1482)
                                                      at com.android.server.am.ActivityStackSupervisor.startActivityMayWait(ActivityStackSupervisor.java:951)
                                                      at com.android.server.am.ActivityManagerService.startActivityAsUser(ActivityManagerService.java:3369)
                                                      at com.android.server.am.ActivityManagerService.startActivity(ActivityManagerService.java:3356)
                                                      at android.app.ActivityManagerNative.onTransact(ActivityManagerNative.java:139)
                                                      at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:2208)
                                                      at android.os.Binder.execTransact(Binder.java:446)
                                                   Caused by: java.lang.ClassNotFoundException: Didn't find class "com.example.MyClass" on path: DexPathList[[directory "."],nativeLibraryDirectories=[/vendor/lib, /system/lib]]
                                                      at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
                                                      at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
                                                      at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
                                                      at java.lang.Class.classForName(Native Method) 
                                                      at java.lang.Class.forName(Class.java:309) 
                                                      at java.lang.Class.forName(Class.java:273) 
                                                      at android.os.Parcel.readParcelableCreator(Parcel.java:2281) 
                                                      at android.os.Parcel.readParcelable(Parcel.java:2245) 
                                                      at android.os.Parcel.readValue(Parcel.java:2152) 
                                                      at android.os.Parcel.readArrayMapInternal(Parcel.java:2485) 
                                                      at android.os.BaseBundle.unparcel(BaseBundle.java:221) 
                                                      at android.os.BaseBundle.getString(BaseBundle.java:918) 
                                                      at android.app.ActivityOptions.<init>(ActivityOptions.java:570) 
                                                      at com.android.server.am.ActivityRecord.<init>(ActivityRecord.java:417) 
                                                      at com.android.server.am.ActivityStackSupervisor.startActivityLocked(ActivityStackSupervisor.java:1482) 
                                                      at com.android.server.am.ActivityStackSupervisor.startActivityMayWait(ActivityStackSupervisor.java:951) 
                                                      at com.android.server.am.ActivityManagerService.startActivityAsUser(ActivityManagerService.java:3369) 
                                                      at com.android.server.am.ActivityManagerService.startActivity(ActivityManagerService.java:3356) 
                                                      at android.app.ActivityManagerNative.onTransact(ActivityManagerNative.java:139) 
                                                      at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:2208) 
                                                      at android.os.Binder.execTransact(Binder.java:446) 
                                                    Suppressed: java.lang.ClassNotFoundException: com.example.MyClass
                                                      at java.lang.Class.classForName(Native Method)
                                                      at java.lang.BootClassLoader.findClass(ClassLoader.java:781)
                                                      at java.lang.BootClassLoader.loadClass(ClassLoader.java:841)
                                                      at java.lang.ClassLoader.loadClass(ClassLoader.java:504)
                                                            ... 19 more
                                                   Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack available

最佳答案

Classes implementing the Parcelable interface must also have a non-null static field called CREATOR of a type that implements the Parcelable.Creator interface.

引用:https://developer.android.com/reference/android/os/Parcelable.html

为了以一种简单的方式做到这一点,请尝试找到可以处理可打包创建的插件。 例子: https://github.com/mcharmas/android-parcelable-intellij-plugin

关于android - 在 Bundle 中传递对象 - ClassNotFoundException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39101829/

相关文章:

android - Activity.isFinishing() 返回 true 但错误

android - onClick 错误地启动 Activity(在 2.3.6 中)

magento - 获取 bundle 产品的单个选项 ID

php - 如何覆盖 Symfony2 包中的实体

Symfony2 bundle 未注册

android - 如何防止 TouchEvent 滚动

Android:DownloadManager 是作为 FIFO 还是同时下载文件

Android 媒体播放器在接到来电后无法恢复。?

java - ListView 长按后 AlertDialog 中的可点击选项

android - 当设备方向改变时 onCreate 方法不断被调用