当前位置: 首页 > 知识库问答 >
问题:

在Bundle-ClassNotFoundException中传递对象

孔星宇
2023-03-14

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

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

共有1个答案

鞠鸿雪
2023-03-14

实现Parcelable接口的类还必须具有一个非Null静态字段,该字段名为CREATOR,其类型为实现Parcelable.CREATOR接口的类型。

参考:https://developer.android.com/reference/android/os/parcelable.html

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

 类似资料:
  • 问题内容: 我正在尝试将自己的自定义对象传递到包中: 我得到错误: 问题答案: 一种方法是让您的自定义对象实现Parcelable接口并使用

  • 我有一个问题,我似乎无法独自解决。如果有一个OSGI捆绑包,它使用blueprint实例化应该部署到Karaf 3.0.0的对象。问题是,ClassNotFoundExceptions一直困扰着我,尽管相应的jar都位于捆绑包jar中。这是我的pom.xml: 这是我的一个blueprint xml文件(该文件导致ClassNotFoundException): 最后,这是我在尝试启动捆绑包时收到

  • 在我的代码中,我使用两种方法将数据传递给一个新的片段。或者我通过Bundle传递数据,或者有时编写setter来传递数据。 两个工作都很好,还没有问题。 但现在,我正在优化我的代码,同时考虑保存实例、方向更改或任何其他可能丢失数据的方式。 因此,在我心目中,确切的疑问是通过bundle发送的数据是否在定向更改/从后台恢复的片段默认情况下保持完整。或者在bundle的情况下也必须使用savedIns

  • 本文向大家介绍在Android中通过Intent使用Bundle传递对象的使用方法,包括了在Android中通过Intent使用Bundle传递对象的使用方法的使用技巧和注意事项,需要的朋友参考一下 Android开发中有时需要在应用中或进程间传递对象,下面详细介绍Intent使用Bundle传递对象的方法。 被传递的对象需要先实现序列化,而序列化对象有两种方式:java.io.Serializa

  • 本文向大家介绍Android 中为什么要用Fragment.setArguments(Bundle bundle)来传递参数,包括了Android 中为什么要用Fragment.setArguments(Bundle bundle)来传递参数的使用技巧和注意事项,需要的朋友参考一下 Fragment在Android3.0开始提供,并且在兼容包中也提供了Fragment特性的支持。Fragment的

  • 问题内容: 我有一些来自Android市场的崩溃报告日志,如下所示: 请注意,我使用的是proguard->这就是为什么“缺少”的类名是“ a.ae”的原因。 实际上,“ a.ae”是proguard赋予类“ MyObject”的名称,如下所示。 为什么会发生这种想法? 我认为这与proguard无关,因为如果这是由proguard类重命名引起的问题,它应该一直存在,并且我可以自己重现此问题。 它

  • 我在Angular2中有一个组件托管用户表(userTableComponnent)和另一个userDetails组件。单击用户表中的行后,我想路由到用户详细信息。一种实现是仅传递 userId,因此在 userDetails 中,我使用另一个 http get 获取用户的详细信息。但是,这是多余的,因为我在userTableComponent中获取了所有用户信息。因此,我真正需要的是将 User

  • 我在JBoss 7.1.1中部署了一个简单的OSGi测试包,并尝试通过以下方式动态实例化Jacorb ORB 我所得到的只是 我已经做了: > 我添加了到我的中,内容如下 我还对类加载器进行了实验,发现ContextClassLoader是。但最后,我不能将其作为非测试代码,因为不能更改为使用特定的类加载器。 那么,为什么我得到这个ClassNotFoundExcema? 提前谢谢 亚历克斯