上下文:
实现一个活动刷3个片段,每个片段在内存使用上相当"重"。
症状:
几次滑动后,左右碎片不再显示,取而代之的是黑色的空背景。中心片段仍然显示。
注意事项:
- 我在下面的其他项目中使用了相同的实现包含更多静态布局的片段没有任何问题
- 问题似乎并非出现在所有设备上
FragmentPagerAdapter:的实现
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
public class MyFragmentPagerAdapter extends FragmentPagerAdapter {
public MyFragmentPagerAdapter(final FragmentManager fm, final Context context) {
super(fm);
}
@Override
public Fragment getItem(final int i) {
switch (i) {
case 0:
return new FragmentA();
case 1:
return new FragmentB();
default:
return new FragmentC();
}
}
@Override
public int getCount() {
return 3;
}
}
在我的活动中:
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.ViewPager;
private MyFragmentPagerAdapter fragmentPagerAdapter;
private ViewPager mViewPager;
@Override
public void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_dummy);
this.fragmentPagerAdapter = new MyFragmentPagerAdapter(getSupportFragmentManager());
// Set up the ViewPager, attaching the adapter.
this.mViewPager = (ViewPager) findViewById(R.id.actMainPager);
this.mViewPager.setAdapter(this.fragmentPagerAdapter);
我的假设是,这些碎片被销毁是为了释放一些记忆,而不再被创造。
我尝试过的:
- 使用
FragmentStatePagerAdapter
,因为我的片段包含了很多"沉重"的数据 - 我在这里或谷歌上找不到任何与此问题有关的内容
有人经历过这个问题并有解决方案吗?我做错什么了吗?
编辑
在堆栈跟踪之后,片段已经分离。有人知道为什么吗?如何重新尝试?
Exception in handleMessage: java.lang.IllegalStateException: Fragment StatusFragment{41f9bc20} not attached to Activity
03-19 12:46:06.743: W/BaseFragment(30801): at android.support.v4.app.Fragment.getResources(Fragment.java:579)
03-19 12:46:06.743: W/BaseFragment(30801): at com.dummy.fragment.BaseFragment.updateButtonStatus(BaseFragment.java:482)
03-19 12:46:06.743: W/BaseFragment(30801): at com.dummy.fragment.BaseFragment$MyHandler.handleMessage(BaseFragment.java:467)
我自己找到了一个解决方案,尽管这是一个解决方案。将ViewPager
的setOffscreenPageLimit
设置为2而不是1,以使2个左右片段永远不会分离:
this.mViewPager = (ViewPager) findViewById(R.id.actMainPager);
this.mViewPager.setAdapter(this.fragmentPagerAdapter);
mViewPager.setOffscreenPageLimit(2);
这是有效的,但它并不能解释为什么碎片没有被重新连接,并且对于更高数量的碎片来说是不可接受的,因为它会阻止内存释放。