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

为什么即使我没有实现必要的功能,Parcelable也能工作呢?

殷承恩
2023-03-14

我希望在屏幕旋转期间保留一个复杂的java对象,因此我使该对象可打包并实现了必要的方法:

  1. 在writeToParcel(Parcel dest,int flags)方法中,我将一些值保存到“dest”。
  2. 在Parcelable.Creator的createFromParcel(Parcel source)方法中,我以正确的顺序从“source”中获取了值,并返回了相应的对象。

然后在Fragment的onSaveInstanceState中保存了可Parcelable:

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putParcelable("myObject", myObject);
}

并在Fragment的onCreate中获得了我的对象:

@Override
public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  MyObject myObject = savedInstanceState.getParcelable("myObject");
}

这很管用。

    null

当我运行应用程序时,我得到了完全相同的结果!我得到了一个包含所有适当值的对象。

为什么这能奏效?Parcelable是否“自动”创建可打包对象

共有1个答案

阎嘉荣
2023-03-14

是的,所以这与Bundle内部处理缓存和打包的方式有关。调用putParcelable()时,它将运行以下代码:

public void putParcelable(@Nullable String key, @Nullable Parcelable value) {
    unparcel();
    mMap.put(key, value);
    mFdsKnown = false;
}

因此,基本上,bundle中的数据不会立即写入parcel--mmap是一个arraymap ,它包含了bundle中插入或删除所有对象的缓存。

在某个时候,将在bundle上调用WriteTopArcel(),此时mmap中的所有内容都写入MParcelledData

因此,基本上,当您进行配置更改时,仍然没有被写入中,因此您传入的对象的相同实例仍然存储在mmap中(因此您的对象也从未调用过WriteToParcel()--您可以通过断言配置更改之前和之后的对象具有相同的System.IdentityHashCode())来确认这一点。

您可以在basebundle中看到有关这方面的注释:

// Invariant - exactly one of mMap / mParcelledData will be null
// (except inside a call to unparcel)

ArrayMap<String, Object> mMap = null;

/*
 * If mParcelledData is non-null, then mMap will be null and the
 * data are stored as a Parcel containing a Bundle.  When the data
 * are unparcelled, mParcelledData willbe set to null.
 */
Parcel mParcelledData = null;

因此,如果您将parcelable对象写入保存状态包,并将应用程序放在后台直到进程结束(或者我相信您可以通过运行adb shell am kill )然后继续,那么您将遇到数据未正确打包的问题。

 类似资料:
  • 我有一个功能,会显示其他内容和隐藏最近的内容。但当我单击submit输入时,它就不工作了。我尝试使用锚标记和按钮标记,它有相同的输出。 HTML: null null 我尝试使用和以及,但没有发生任何事情。我也找到了一个答案,但不像我的问题。

  • 问题内容: 我不明白为什么Python没有功能。它有一个内置的(我认为是姐姐),但没有。 在python 2.6中甚至有一个函数(在math中),但是没有符号。当您可以只写一个然后直接从中获取时,为什么还要写一个?后者会更清楚:x带有y的符号,而带copysign的则必须记住它是x带有y的符号还是y带有x的符号! 显然,除了,它不提供任何其他功能,但是它也将更具可读性(对于像python这样的高度

  • 问题内容: 在Python 3中,operator.or_等效于按位,而不是逻辑。为什么没有逻辑运算符? 问题答案: 在与运营商不能表示为,因为它们的功能短路行为: 在这些情况下,永远不会调用。 另一方面,假设的则必须调用,因为函数参数总是在调用函数之前进行求值。

  • 当我将java对象转换为json字符串时,我尝试组织动态@JsonIgnore属性。在示例中,它以下一种方式为(codehause jackson)ObjectMapper oMapper=new ObjectMapper();奥马尔。setSerializationConfig(。。。 或者以fasterxml objectMapper为例。getSerializationConfig()。se

  • 我的Eclipse项目中出现了如下构建错误: 但是如果您看到了有效的pom.xml,那么JUnit4依赖项就存在了: 如果将此依赖项显式添加到中,则错误将消失。 为什么会这样呢?如果它已经在那里,不应该使用它吗? 这是我的

  • 问题内容: 我认为这个问题已经存在,但是我找不到。 我不明白,为什么必须要有一个功能接口才能使用lambda。考虑以下示例: 这可以正常工作,但是如果您取消注释行,则不会。为什么?以我的理解,编译器应该能够区分这两种方法,因为它们具有不同的输入参数。为什么我需要一个功能接口并炸毁我的代码? 编辑:链接的重复项没有回答我的问题,因为我在询问不同的方法参数。但是在这里,我得到了一些非常有用的答案,这要