Android应用程序在使用Fragments和ViewPager一段时间后崩溃

在尝试恢复我的碎片时,我的 Android应用程序崩溃了.我没有向我正在尝试恢复的捆绑包添加任何自定义变量,这都是认值.我正在使用Fragments和ViewPager.请参阅下面的代码段:
public static class MyAdapter extends FragmentStatePagerAdapter {
    public MyAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public int getCount() {
        return NUM_ITEMS;
    }

    public int getCurrentItemPosition(Fragment fragment){
        return getItemPosition(fragment);
    }

    @Override
    public Fragment getItem(int position) {
        return ContentFragment.newInstance(position);
    }
}

public class MyActivity extends FragmentActivity {

static final int NUM_ITEMS = 100000;
public int currentSelectedPage;
private int changetoFragmentIndex;
public DateTime midDate;
MyAdapter mAdapter;
ViewPager mPager;

/** Called when the activity is first created. */
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.diary);
    MyApplication application = (MyApplication)getApplication();
    application.dataController.myActivity = this;
    mAdapter = new MyAdapter(getSupportFragmentManager());
    mPager = (ViewPager)findViewById(R.id.pager);
    mPager.setAdapter(mAdapter);
    int newDay = application.daysBetween(DateTime.Now(),DateTime.parse(application.day.datetoShortString()));

    this.currentSelectedPage = NUM_ITEMS/2+newDay;
    mPager.setCurrentItem(NUM_ITEMS/2+newDay);
    mPager.setonPagechangelistener(new SimpleOnPagechangelistener(){
        public void onPageSelected(int position){
            currentSelectedPage = position;
            ContentFragment fragment = (ContentFragment) mAdapter.instantiateItem(mPager,currentSelectedPage);
            fragment.loadData();
        }
    });
}

}

public class ContentFragment extends Fragment {
private View v;
static final int NUM_ITEMS = 100000;

static ContentFragment newInstance(int num) {
    ContentFragment f = new ContentFragment();

    return f;
}

@Override
public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) {
    if (container == null)
        return null;
    v = inflater.inflate(R.layout.diarycontent,container,false);
    return v;
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

}

@Override
public void onSaveInstanceState(Bundle savedInstanceState){
    super.onSaveInstanceState(savedInstanceState);
    setUserVisibleHint(true);
}
}

我收到这个stackstrace:

Caused by: java.lang.NullPointerException
at android.support.v4.app.FragmentManagerImpl.getFragment(FragmentManager.java:519)
at android.support.v4.app.FragmentStatePagerAdapter.restoreState(FragmentStatePagerAdapter.java:1 55)
at android.support.v4.view.ViewPager.onRestoreInstanceState(ViewPager.java:522)

据我所知,这可能是支持包的一个已知问题,一个可能的解决方案是在onSaveInstanceState中使用setUserVisibleHint(true).但这没有帮助.

有谁知道问题的另一个解决方案或我做错了什么?

解决方法

一旦我开始在Tab中使用带有FragmentStatePagerAdapter的ViewPager,我就遇到了同样的问题.

然后我玩了与这个问题相关的所有论坛,并打破了我的头两天,找出为什么发生这个问题以及如何解决它,但没有找到任何满足我的要求的完美解决方案.

我得到了解决方案,以避免NPE崩溃使用FragmentPagerAdapter而不是FragmentStatePagerAdapter.当我替换FragmentPagerAdapter而不是FragmentStatePagerAdapter然后没有遇到NPE崩溃问题但是同一页面本身没有刷新以进行进一步导航(这是我的要求).

最后覆盖FragmentStatePagerAdapter上的saveState方法,一切正常工作.

@Override
public Parcelable saveState() {
    // Do nothing
    return null;
}

我如何轻松地重现这个问题:
我使用更高版本(4.1)设备并按照以下步骤操作:
1.转到设置 – >开发者选项.
2.单击“不要保留活动”选项.

现在我玩我的应用程序.

每次应用程序因android.support.v4.app.FragmentManagerImpl.getFragment(未知来源)中的NPE而崩溃时覆盖saveState()方法.但是在覆盖saveState()之后没有注册崩溃.

我希望通过这样做你不会有任何问题.

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...