【问题标题】:Android: Parcelable class that contains a parcelable fieldAndroid:包含可打包字段的可打包类
【发布时间】:2014-07-22 18:52:40
【问题描述】:

注意:解决方案以我不能接受的解决方案开头,因为这是我自己的答案。我希望这对其他人有帮助。

我想让我的课程,包括一个可包裹的对象,可包裹。换句话说,假设我有一个包含 3 个字段的类:字符串名称、int id 和 Location loc。现在我想让这个类 Parcelable。我该怎么做?到目前为止,这就是我所做的:

public MyClass(Parcel in) {
name = in.readString();
id = in.readInt();
loc = in.readParcelable(Location.class.getClassLoader()); }

public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
dest.writeInt(id);
dest.writeParcelable(loc, flags); }

当我去使用它时,我得到一个错误:解组时找不到类... 有谁知道我为什么会收到此错误以及如何解决? 提前感谢您的任何回答。

编辑:

我必须补充一点,因为我正在将这些数据发送到一个在他自己的进程上工作的服务,我正在使用 Handler 技术,所以这可能是问题所在。但该方法仍然做得很好,因为它一直运行良好,直到我在 MyClass 中引入 Location 对象。

【问题讨论】:

标签: android parcelable


【解决方案1】:

解决方案:我找到了解决方案。我的实现很好。问题是我在一个单独的进程中发送消息,所以我需要设置正确的类加载器以使其正常工作。所以上面的代码是正确的,我必须改变的是当我从包或消息中检索对象时。即使没有人将其设置为正确答案,我也会粘贴给我解决方案的链接:Problem unmarshalling parcelables

【讨论】:

    【解决方案2】:

    这部分代码看起来是对的。

    • 确保您在 Location 内也正确执行 Parcel 操作。
    • 另一件可能出错的事情是,如果您在包含 Location 之前对类进行了序列化,而现在您正试图反序列化尚无 Location 的旧对象。

    【讨论】:

    • 感谢您的回答。关于你所说的两点,在第一点中我实际上使用了 android.location.Location 的位置,所以我认为它是正确的。对于第二点,我想我不明白。 lz你能解释一下吗?
    • 另一件需要指出的事情是,我尝试通过传递所有单个元素而不是类本身的实例来传递 MyClass 对象,并且它确实有效。换句话说,如果我这样做: Bundle b = new Bundle(); b.putString("testName", name); b.putInt("testId", id); b.putParcelable("testLoc", loc);然后我发送它并在它工作的另一个类中检索它。如果我确实发送 b.putParcelable("test", myClass);在 MyClass 实例中的 myClass 我得到错误
    • 不要介意 2。只有当您将包裹写入存储并在类本身可能已经更改时尝试稍后读取它时才相关。我不知道你使用 android 的 Location 类。
    猜你喜欢
    • 2012-01-01
    • 2014-10-30
    • 1970-01-01
    • 1970-01-01
    • 2011-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多