我希望在屏幕旋转期间保留一个复杂的java对象,因此我使该对象可打包并实现了必要的方法:
然后在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");
}
这很管用。
当我运行应用程序时,我得到了完全相同的结果!我得到了一个包含所有适当值的对象。
为什么这能奏效?Parcelable是否“自动”创建可打包对象?
是的,所以这与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。考虑以下示例: 这可以正常工作,但是如果您取消注释行,则不会。为什么?以我的理解,编译器应该能够区分这两种方法,因为它们具有不同的输入参数。为什么我需要一个功能接口并炸毁我的代码? 编辑:链接的重复项没有回答我的问题,因为我在询问不同的方法参数。但是在这里,我得到了一些非常有用的答案,这要