但凡项目中有用到Fragment的,基本上都会遇到RT问题。笔者在网上查了很多相关资料,都没有发现对出现这个问题的原因进行深入分析的。所以打算在本文结合源码来分析下这个问题的产生,并提供解决方案。下面进入正题,直接上报错信息:
Caused by: android.support.v4.app.Fragment$InstantiationException: Unable to instantiate fragment com.ckjr.context.VoteActivity$VoteFragment: make sure class name exists, is public, and has an empty constructor that is public
然而并没有太大软用,在手机上运行一段时间后,内存不够,应用被回收掉。再次进入依然需要重新创建,crash。
其实原因很简单。当切换到其他应用时,会调用FragmentActivity的onSaveInstanceState方法,再次进入,Activity重新创建,onCreate方法中会拿到savedInstanceState并re-instantiate。
我们先进入onSaveInstanceState():
/**
* Save all appropriate fragment state.
*/
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
Parcelable p = mFragments.saveAllState();
if (p != null) {
outState.putParcelable(FRAGMENTS_TAG, p);
}
}
Parcelable saveAllState() {
.......
FragmentManagerState fms = new FragmentManagerState();
fms.mActive = active;
fms.mAdded = added;
fms.mBackStack = backStack;
return fms;
}
非常简单,将Fragment的状态保存到outState,而outState就是onCreate方法中的savedInstanceState。fms.Added,是一个数组,每当调用addFragment或attachFragment就会往里添加;fms.Active,在addFragment()中调用makeActive()将Fragment往其中添加;fms.mBackStack,Fragment栈,用