FragmentStatePagerAdapter的getFragment(int position) 导致的NullPointerException

本文介绍了解决ViewPager结合FragmentStatePagerAdapter在特定条件下出现的空指针异常问题。提供了三种解决方案,包括更换适配器类型、重写saveState方法返回null及在restoreState方法中捕获异常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

totalList.add(TaskFragment.newInstance(TASK_TYPE_DAILY));
        totalList.add(TaskFragment.newInstance(TASK_TYPE_GROW));
        totalList.add(TaskFragment.newInstance(TASK_TYPE_CYCLE));

        viewpagerTask.setAdapter(new FragmentStatePagerAdapter(getSupportFragmentManager()) {
            @Override
            public int getCount() {
                return totalList.size();
            }

            @Override
            public Fragment getItem(int position) {
                return totalList.get(position);
            }

            @Override
            public CharSequence getPageTitle(int position) {
                if (position == 0) {
                    return "日常任务";
                } else if (position == 1) {
                    return "成长任务";
                } else {
                    return "周期任务";
                }
            }
        });
        viewpagerTask.setOffscreenPageLimit(3);

我的TaskActivity中有一个viewpager,装载3个fragment碎片:

发现偶尔有时候会出现以下崩溃log:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.sina.book/com.sina.book.ui.activity.bookstore.TaskActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object android.util.SparseArray.get(int)' on a null object reference
	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3000)
	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3078)
	at android.app.ActivityThread.-wrap11(Unknown Source:0)
	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794)
	at android.os.Handler.dispatchMessage(Handler.java:106)
	at android.os.Looper.loop(Looper.java:187)
	at android.app.ActivityThread.main(ActivityThread.java:7025)
	at java.lang.reflect.Method.invoke(Native Method)
	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:514)
	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:888)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object android.util.SparseArray.get(int)' on a null object reference
	at android.support.v4.app.FragmentManagerImpl.getFragment(FragmentManager.java:905)
	at android.support.v4.app.FragmentStatePagerAdapter.restoreState(FragmentStatePagerAdapter.java:216)
	at android.support.v4.view.ViewPager.onRestoreInstanceState(ViewPager.java:1455)
	at android.view.View.dispatchRestoreInstanceState(View.java:17993)
	at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:3859)
	at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:3865)
	at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:3865)
	at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:3865)
	at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:3865)
	at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:3865)
	at android.view.View.restoreHierarchyState(View.java:17971)
	at com.android.internal.policy.PhoneWindow.restoreHierarchyState(PhoneWindow.java:2198)
	at android.app.Activity.onRestoreInstanceState(Activity.java:1173)
	at android.app.Activity.performRestoreInstanceState(Activity.java:1128)
	at android.app.Instrumentation.callActivityOnRestoreInstanceState(Instrumentation.java:1260)
	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2973)
	... 9 more
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object android.util.SparseArray.get(int)' on a null object reference
	at android.support.v4.app.FragmentManagerImpl.getFragment(FragmentManager.java:905)
	at android.support.v4.app.FragmentStatePagerAdapter.restoreState(FragmentStatePagerAdapter.java:216)
	at android.support.v4.view.ViewPager.onRestoreInstanceState(ViewPager.java:1455)
	at android.view.View.dispatchRestoreInstanceState(View.java:17993)
	at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:3859)
	at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:3865)
	at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:3865)
	at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:3865)
	at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:3865)
	at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:3865)
	at android.view.View.restoreHierarchyState(View.java:17971)
	at com.android.internal.policy.PhoneWindow.restoreHierarchyState(PhoneWindow.java:2198)
	at android.app.Activity.onRestoreInstanceState(Activity.java:1173)
	at android.app.Activity.performRestoreInstanceState(Activity.java:1128)
	at android.app.Instrumentation.callActivityOnRestoreInstanceState(Instrumentation.java:1260)
	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2973)
	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3078)
	at android.app.ActivityThread.-wrap11(Unknown Source:0)
	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794)
	at android.os.Handler.dispatchMessage(Handler.java:106)
	at android.os.Looper.loop(Looper.java:187)
	at android.app.ActivityThread.main(ActivityThread.java:7025)
	at java.lang.reflect.Method.invoke(Native Method)
	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:514)
	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:888)

然后这个bug不是必现,所以复现起来有些麻烦。幸好网上大牛还是厉害,找到了复习办法:

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

怎么解决呢?

经过一番Google,得到一些解决办法,有两种:

第一种:讲FragmentStatePagerAdapter改为FragmentPagerAdapter;

第二种:重写FragmentStatePagerAdapter的saveState()方法,直接return null;

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

第三种:重写FragmentStatePagerAdapter的restoreState方法,捕获异常



            @Override
            public void restoreState(Parcelable state, ClassLoader loader) {
                try {
                    super.restoreState(state, loader);
                } catch (NullPointerException e) {

                }
            }

其实,第二种方法屏蔽了FragmentStatePagerAdapter的保存数据的特性之后,就跟第一种方法没有区别了!

说改就改,过几天看看测试的妹子会不会找过来!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值