jus*_*oob 4 android android-fragments
作为一种替代方案Intent,我Fragment在Activity重新创建期间将数据保存在保留的无头中(我保存的对象可能非常大,并且它不符合a的大小限制Intent,我认为这是比序列化更快的方法 -例如,反序列化为JSON).
虽然我的实现有点不同,但我从这篇Google文档中得到了这个想法.
的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;
}
}
Run Code Online (Sandbox Code Playgroud)
我Fragment在onSaveInstanceState()我的方法中将数据保存到此Activity:
@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);
}
Run Code Online (Sandbox Code Playgroud)
以及相关部分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();
}
Run Code Online (Sandbox Code Playgroud)
这在方向变化方面完美无瑕.
问题是,有时,当我的应用程序在后台并且我正在返回它时,dataFragment.getData()返回null.
换句话说,在下面的行中onCreate()有时data是null:
data = dataFragment.getData();
Run Code Online (Sandbox Code Playgroud)
这怎么可能?
它不会抛出NullPointerException,所以dataFragment不null肯定的.
为什么它的初始化实例变量变成了null?
Epi*_*rce 11
你遇到的是过程死亡.
从技术上讲,它也被称为"低内存条件".
保留的片段与应用程序一起被杀死,但FragmentActivity会重新创建保留的片段super.onCreate(),因此您可以通过其标记找到它,但其中的数据不会被初始化.
将应用程序置于后台,然后按Android Studio左下角的红色X以终止该过程.这再现了这种现象.
| 归档时间: |
|
| 查看次数: |
1145 次 |
| 最近记录: |