片段的onPause()中的缓存数据在返回片段时为null
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了片段的onPause()中的缓存数据在返回片段时为null相关的知识,希望对你有一定的参考价值。
我有一个片段,它在布局中包含一个MapView
(但它与我要问的问题无关,但请记住它。):
public class MyFragment extends Fragment {
// I have a variable used to cache data in onPause()
private MyData mData;
@BindView(R.id.map)
MapView mMapView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// I initiate my data in onCreate()
mData = new MyData();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.mylayout, container, false);
if (mMapView != null) {
// initiate map view
mMapView.onCreate(savedInstanceState);
mMapView.getMapAsync(this);
}
}
@Override
public void onResume() {
super.onResume();
}
@Override
public void onPause() {
super.onPause();
// in onPause() I cache the data I got from another instance
mData = someInstance.getHoldData();
}
/*map view callback! Here, I check the value of mData, when comes back to this fragment, it always get called*/
@Override
public void onMapReady(GoogleMap googleMap) {
// I use data here, when comes back to this fragment, this is always called.
// PROBLEM: sometimes mData is null, why?
checkCachedData(mData);
}
}
所以,这就是我上面的内容:
- 我在qazxsw poi回调片段中发起了qazxsw poi,它只召唤一次。
- 我在
mData
中准备了地图视图,当回到这个片段时,它总是被调用。 - 我在onPause()中缓存数据
onCreate()
的onCreateView(...)
被称为第一次发射该片段。
问题:当我转到另一个片段然后回到onCreate()
时,没有调用MyFragment
,这意味着在内存中仍然存在MyFragment的前一个实例。但是,当回到这个片段时,有时MyFragment
在onCreate()
回调中为空。为什么?我不明白。为什么mData
可以为null&onCreate()不被调用?
====我切换到另一个片段:===
onMapReady(GoogleMap googleMap)
答案
我假设当你说你有另一个片段你去的时候,你的意思是你正在导航,例如,使用导航抽屉。当您的片段被另一个片段替换时,第一个片段会暂停。这意味着将调用onPause回调。当片段作为前景片段返回时,它将恢复,因此将调用onResume回调。要解决您的问题,您应该:
- 缓存onPause中的数据;
- 在onResume中恢复它。
以上是关于片段的onPause()中的缓存数据在返回片段时为null的主要内容,如果未能解决你的问题,请参考以下文章