问题:
java.lang.StackOverflowError: stack size 8MB
at android.os.Handler.sendMessageAtTime(Handler.java:630)
at android.view.ViewRootImpl$ViewRootHandler.sendMessageAtTime(ViewRootImpl.java:3709)
at android.os.Handler.sendMessageDelayed(Handler.java:600)
at android.view.ViewRootImpl.dispatchInvalidateDelayed(ViewRootImpl.java:6872)
at
***********************************************
发生的场景:
使用一个第三方框架navigationtabbar,底部导航栏配合Fragment切换的时候出现的错误,而且这个错误在Android8.0之前不会出现,昨天升级了模拟器,在Android8.0模拟器上出现的,说明代码在Android8.0上面运行还是有点问题。具体报错的那一行是:
mNavigationTabBar.setModelIndex(currentIndex);
我是在showFragment的时候写这行代码的:
private void showFragment(int currentIndex){
mNavigationTabBar.setModelIndex(currentIndex);
hideAllFragment();
switch (currentIndex){
case 0:
FragmentUtils.show(mHeartFragment);
break;
case 1:
FragmentUtils.show(mCupFragment);
break;
case 2:
FragmentUtils.show(mDiplomaFragment);
break;
case 3:
FragmentUtils.show(mFlagFragment);
break;
case 4:
FragmentUtils.show(medalFragment);
break;
}
}
而调用showFragment方法的主要场景是在NavigationTabBar的一个监听方法里(NavigationTabBar.OnTabBarSelectedIndexListener)的回调:
@Override
public void onEndTabSelected(NavigationTabBar.Model model, int index) {
switch (index){
case 0:
mCurrentIndex = 0;
showFragment(0);
break;
case 1:
mCurrentIndex = 1;
showFragment(1);
break;
case 2:
mCurrentIndex = 2;
showFragment(2);
break;
case 3:
mCurrentIndex = 3;
showFragment(3);
break;
case 4:
mCurrentIndex = 4;
showFragment(4);
break;
}
}
网上说的出现java.lang.StackOverflowError: stack size 8MB
错误的原因是:
在fragment中
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState)
方法中加载一个布局文件View view = inflater.inflate(R.layout.fragment_home, container);中把container改成null
试了没有。
我想的是,既然已经是在onEndTabSelected方法里了,说明已经对底部导航栏的item进行了切换了,不需要在额外对item切换进行操作,所以我把下面报错这行代码删除了:
mNavigationTabBar.setModelIndex(currentIndex);
果然删除之后,在Android8.0模拟器上运行就没问题了。