gpt4 book ai didi

java - Android:永远不会调用 Parcelable.writeToParcel 和 Parcelable.Creator.createFromParcel

转载 作者:IT老高 更新时间:2023-10-28 20:29:39 26 4
gpt4 key购买 nike

我对在这里发布问题完全陌生,但是多年来我一直在这里阅读很多内容。通常我总是能够通过彻底搜索网络找到我的答案,但这次我不知所措......

在又花了一天的时间试图弄清楚为什么这不起作用之后,我决定寻求帮助,希望你们能给我一些建议,或者更好的解决方案。

问题:在 Android 游戏中,我必须让应用程序记住它的状态,例如当用户按主屏幕按钮。经过一番搜索,我意识到为了让我的类在重新打开应用程序后初始化回适当的状态,我必须支持 Parcelable 接口(interface)才能通过 Bundle 传递它们。

在我的 onStop 和 onStart 函数中,我分别在 Bundle 中保存和恢复游戏状态,但是当我在 Bundle 上调用 putParcelable 和 getParcelable 函数时,永远不会调用对象的 writeToParcel 和 createFromParcel 函数。

担心这可能是由于游戏的相对复杂性,我想我最好创建一个非常简单的应用程序来尝试让它工作。

根据我在网上看到的许多 Parcelable 示例,这成为了我的类(class):

public class ParcelableTest implements Parcelable {
int id;

public ParcelableTest(int newID)
{
id = newID;
}

private ParcelableTest(Parcel in) {
readFromParcel(in);
}

public void writeToParcel(Parcel out, int arg1) {
writeToParcel(out);
}

public void writeToParcel(Parcel out) {
Log.v("ParcelableTest","Writing to parcel");
out.writeInt(id);
}

public void readFromParcel(Parcel in) {
id = in.readInt();
}

public int describeContents() {
return 0;
}

public static final Parcelable.Creator<ParcelableTest> CREATOR = new
Parcelable.Creator<ParcelableTest>() {
public ParcelableTest createFromParcel(Parcel in) {
Log.v("ParcelableTest","Creating from parcel");
return new ParcelableTest(in);
}

public ParcelableTest[] newArray(int size) {
return new ParcelableTest[size];
}
};
}

从我的主要 Activity 中,我会调用以下函数来保存/恢复数据:

public Bundle saveToBundle(Bundle savedState)
{
savedState.putParcelable("Test1",mTest1);
savedState.putParcelable("Test2",mTest2);
return savedState;
}
public void restoreFromBundle(Bundle savedState)
{
mTest1 = savedState.getParcelable("Test1");
mTest2 = savedState.getParcelable("Test2");

}

但由于某种原因,这两个函数(使用 putParcelable 和 getParcelable 函数)都不会在我的测试类中产生适当的 Parcelable 调用。

最奇怪的是,它确实以某种方式读取了正确的值(我尝试过在类中使用更多变量),但我的调试和日志显示应用程序永远不会去 writeToParcel 和 createFromParcel。

我在这里错过了什么?

任何帮助/想法将不胜感激。

最佳答案

显然,Android Bundle 类不遵守 parcelable 协议(protocol),而是在 IPC 编码期间遵循该协议(protocol)。

相反,Bundle 实现似乎只是通过反射将 Parcelable 对象写入和读取到它自己的内部映射中。从我们所做的测试来看,Bundle 似乎会写入/读取 Parcelable 派生类中定义的每个字段,只是因为您已经声明了这些字段。

关于java - Android:永远不会调用 Parcelable.writeToParcel 和 Parcelable.Creator.createFromParcel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4853952/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com