gpt4 book ai didi

android - 实例变量在保留的 Fragment 中变为 null

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:02:09 24 4
gpt4 key购买 nike

作为 Intent 的替代方案,我在 Activity 重新创建期间将数据保存在保留的 headless Fragment 中(我保存的对象可能非常大,不符合 Intent 的大小限制,我认为这是一种比序列化-反序列化到 JSON 等方式更快的方法。

我的想法来自 this Google documentation ,虽然我的实现有点不同。

fragment :

public class DataFragment extends Fragment {

private Data data;

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
}

public void setData(Data data) {
this.data = data;
}

public Data getData() {
return data;
}
}

我在 ActivityonSaveInstanceState() 方法中将数据保存到此 Fragment:

@Override
protected void onSaveInstanceState(Bundle outState) {
FragmentManager fm = getSupportFragmentManager();
dataFragment = (DataFragment) fm.findFragmentByTag(TAG_DATA);
if (dataFragment == null) {
dataFragment = new DataFragment();
fm.beginTransaction().add(dataFragment, TAG_DATA).commitNow();
}
dataFragment.setData(myData);
super.onSaveInstanceState(outState);
}

以及onCreate()的相关部分:

Data data;
FragmentManager fm = getSupportFragmentManager();
dataFragment = (DataFragment) fm.findFragmentByTag(TAG_DATA);
if (dataFragment == null) {
// the Fragment is not attached, fetching data from DB
DatabaseManager dbm = DatabaseManager.getInstance(this);
data = dbm.getData();
} else {
// the Fragment is attached, fetching the data from it
data = dataFragment.getData();
fm.beginTransaction().remove(dataFragment).commitNow();
}

这可以完美地处理方向变化。

问题是,有时,当我的应用程序在后台并且我返回它时,dataFragment.getData() 返回null.

换句话说,在 onCreate() 的以下行中,有时 datanull:

data = dataFragment.getData();

这怎么可能?

它不会抛出NullPointerException,所以dataFragment肯定不是null

为什么它初始化的实例变量变成了null

最佳答案

你所经历的是过程死亡。

技术上它也被称为“低内存条件”。

保留的 fragment 与应用程序一起被杀死,但 FragmentActivity 在 super.onCreate() 中重新创建您保留的 fragment ,因此您可以通过其标签找到它,但其中的数据不会'不被初始化。

将应用程序置于后台,然后在 Android Studio 中按左下角的红色 X 终止进程。这重现了这种现象。

terminate button

注意:AS 4.0以后,如果你从AS启动你的app,那么“Terminate”会触发Force Stop(不会产生这种现象)。但是如果你之后在手机上从 LAUNCHER 启动你的应用程序,那么你就会遇到这种现象。

关于android - 实例变量在保留的 Fragment 中变为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39785619/

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