Skip to content

java.lang.NullPointerException: Attempt to invoke virtual method 'int me.yokeyword.fragmentation.anim.FragmentAnimator.getEnter()' on a null object reference #825

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
nicai1900 opened this issue Apr 4, 2018 · 11 comments

Comments

@nicai1900
Copy link

nicai1900 commented Apr 4, 2018

#问题出现概率:必现

复现方法

APP启动后,到系统权限设置界面去关闭APP的某个权限,会导致APP进程退出,重新打开APP,就会崩溃

#手机系统:6.0以上

  • Lib 1.3.3
  • Support Lib 27.1.0
  • Log

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int me.yokeyword.fragmentation.anim.FragmentAnimator.getEnter()' on a null object reference at me.yokeyword.fragmentation.helper.internal.AnimatorHelper.initEnterAnim(AnimatorHelper.java:63) at me.yokeyword.fragmentation.helper.internal.AnimatorHelper.notifyChanged(AnimatorHelper.java:29) at me.yokeyword.fragmentation.helper.internal.AnimatorHelper.<init>(AnimatorHelper.java:24) at me.yokeyword.fragmentation.SupportFragmentDelegate.onCreate(SupportFragmentDelegate.java:117)

  • Screenshots

In addition, we do not accept issues unrelated to Fragmentation.

@YoKeyword YoKeyword added the todo label Apr 7, 2018
@YoKeyword
Copy link
Owner

@nicai1900 进程被杀后会做恢复操作,恢复代码在这里

1、复现的机型是?
2、Demo不更改任何代码是否可以复现?

@nicai1900
Copy link
Author

nicai1900 commented Apr 8, 2018

@YoKeyword

1、复现的机型是? 与机型无关,6.0以上需要动态权限就会

2、和哪个Demo无关,问题是必现的。在系统权限管理界面,动态开关APP的权限,进程被干掉,重新打开APP时,savedInstanceState 不为空,但是从savedInstanceState反序列化回来的mFragmentAnimator是空的

因此崩溃了。

SupportFragmentDelegate.java:108

  
    public void onCreate(@Nullable Bundle savedInstanceState) {
       
        //  重新打开APP时,savedInstanceState != null
        if (savedInstanceState == null) {
            getFragmentAnimator();
        } else {
            mSaveInstanceState = savedInstanceState;
            //  这里反序列化回来的结果是null
            mFragmentAnimator = savedInstanceState.getParcelable(TransactionDelegate.FRAGMENTATION_STATE_SAVE_ANIMATOR);
            mIsHidden = savedInstanceState.getBoolean(TransactionDelegate.FRAGMENTATION_STATE_SAVE_IS_HIDDEN);
            mContainerId = savedInstanceState.getInt(TransactionDelegate.FRAGMENTATION_ARG_CONTAINER);

            // RootFragment
            if (mRootStatus != STATUS_UN_ROOT) {
                FragmentationMagician.reorderIndices(mFragment.getFragmentManager());
            }
        }
}

@YoKeyword
Copy link
Owner

YoKeyword commented Apr 8, 2018

@nicai1900 让我很困扰的是: 确实做了恢复操作, 而且我一直无法复现该问题 (即使按你的场景去尝试)

为了更好的排查该问题,可否留个联系方式QQ / 微信,我们进一步交流该问题?

@nicai1900
Copy link
Author

@YoKeyword 我的微信号 zhengjie1900

@z1060932884
Copy link

这个问题解决了吗

@gys0000
Copy link

gys0000 commented Apr 9, 2018

这个问题确实跟机型无关,长时间后台再进到app里面就会出现这样的问题。应该是 mFragmentAnimator为空了,
if (onCreateFragmentAnimator() != null) {
super.onCreate(savedInstanceState);
}
我再继承的界面里面这样改不知道会不会解决这样的问题,希望能交流一下。我的微信:li747921695

@nicai1900
Copy link
Author

nicai1900 commented Apr 9, 2018

@YoKeyword 问题解决了,我自己的错

自己实现了ISupportFragment 接口,漏了复写下面的接口了,因此导致没有保存mFragmentAnimator的数据。

    override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        delegate.onSaveInstanceState(outState)
    }

@z1060932884
Copy link

Caused by java.lang.NullPointerException: Attempt to invoke virtual method 'int me.yokeyword.fragmentation.anim.FragmentAnimator.getEnter()' on a null object reference
me.yokeyword.fragmentation.helper.internal.AnimatorHelper.initEnterAnim (AnimatorHelper.java:63)
me.yokeyword.fragmentation.helper.internal.AnimatorHelper.notifyChanged (AnimatorHelper.java:29)
me.yokeyword.fragmentation.helper.internal.AnimatorHelper.<init> (AnimatorHelper.java:24)
me.yokeyword.fragmentation.SupportFragmentDelegate.onCreate (SupportFragmentDelegate.java:120)
com.pinyou.bingobuy.base.PresenterFragment.onCreate (PresenterFragment.java:89)
android.support.v4.app.Fragment.performCreate (Fragment.java:2068)
android.support.v4.app.FragmentManagerImpl.moveToState (FragmentManager.java:1055)
android.support.v4.app.FragmentManagerImpl.moveToState (FragmentManager.java:1290)
android.support.v4.app.FragmentManagerImpl.moveToState (FragmentManager.java:1272)
android.support.v4.app.FragmentManagerImpl.dispatchCreate (FragmentManager.java:2144)
android.support.v4.app.Fragment.restoreChildFragmentState (Fragment.java:1284)
android.support.v4.app.Fragment.onCreate (Fragment.java:1255)
com.pinyou.bingobuy.base.PresenterFragment.onCreate (PresenterFragment.java:88)
android.support.v4.app.Fragment.performCreate (Fragment.java:2068)
android.support.v4.app.FragmentManagerImpl.moveToState (FragmentManager.java:1055)
android.support.v4.app.FragmentManagerImpl.moveToState (FragmentManager.java:1290)
android.support.v4.app.FragmentManagerImpl.moveToState (FragmentManager.java:1272)
android.support.v4.app.FragmentManagerImpl.dispatchCreate (FragmentManager.java:2144)
android.support.v4.app.FragmentController.dispatchCreate (FragmentController.java:190)
android.support.v4.app.FragmentActivity.onCreate (FragmentActivity.java:351)
android.support.v7.app.AppCompatActivity.onCreate (AppCompatActivity.java:85)
com.pinyou.bingobuy.base.Activity.onCreate (Activity.java:49)
android.app.Activity.performCreate (Activity.java:6303)
android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1108)
android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2376)
android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2483)
android.app.ActivityThread.access$900 (ActivityThread.java:153)
android.app.ActivityThread$H.handleMessage (ActivityThread.java:1349)
android.os.Handler.dispatchMessage (Handler.java:102)
android.os.Looper.loop (Looper.java:148)
android.app.ActivityThread.main (ActivityThread.java:5438)
java.lang.reflect.Method.invoke (Method.java)
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:738)
com.android.internal.os.ZygoteInit.main (ZygoteInit.java:628)

我也在实现ISupportFragment 的接口中重写了那个onSaveInstanceState()方法,我自己怎么测都不会出现这个bug,但是bug收集工具收集了很多这个崩溃信息, 根据用户反馈就是长时间后台再进入就会出现这个问题。

@foolchen
Copy link

foolchen commented Apr 10, 2018

@z1060932884 v4包更新到27.1.1试试。
开发者模式中,把“不保留活动”打开应该就能复现了,应该是应用在后台被杀死,切换到前台重建时出了问题。

@YoKeyword
Copy link
Owner

@z1060932884 楼上2位同学一个同学是忘记在Fragment里delegate.onSaveInstanceState(outState),一个同学是移除了Activity里的super.onSaveInstanceState()

所有检查Activity和Fragment的onSaveInstanceState(),看是否有复写或者忘记委托, 具体复现方式,可以按 @foolchen 提供的方式复现

@z1060932884
Copy link

找到原因了 ,进程杀死时onSaveInstanceState方法在执行次数比onCreate方法执行次数少,然后查看自己写的代码,去掉了一个Fragment加载Fragment的界面就好了。 @YoKeyword @foolchen

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

5 participants