JessYanCoding / MVPArms

⚔️ A common architecture for Android applications developing based on MVP, integrates many open source projects, to make your developing quicker and easier (一个整合了大量主流开源项目高度可配置化的 Android MVP 快速集成框架).
Apache License 2.0
10.28k stars 2.39k forks source link

mPresenter 空指针问题 #281

Closed mny459 closed 5 years ago

mny459 commented 5 years ago

Look at here

Environment

Bug Description:

首先这个Bug我自己没有复现出来,但是在同事的手机上面出现过一次,在Bugly上也出现过多次,就是在 Fragment 中的 mPresenter 为空了。 项目中引入了 Fragmentation ,所以重写了Fragment,在项目中将mPresenter 置空的操作只有如下代码,将从原来的onDestory 提前到了 onDestroyView,(不确定是不是因为这个的原因,因为自己想尽办法了,还是没有复现,也就是说我自己运行是正常的):

    @Override
    public void onDestroyView() {
        if (mPresenter != null) {
            mPresenter.onDestroy();//释放资源
        }
        this.mPresenter = null;
        super.onDestroyView();
    }

Related Code:

报错代码

     @Override
    public void initData(@Nullable Bundle savedInstanceState) {
       // 省略其他初始化代码
        mPresenter.initHomeDevice();
    }

Bug Log:

Stack trace:  
java.lang.NullPointerException: Attempt to invoke virtual method 'void com.包名省略.mvp.presenter.DeviceOperationPresenter.f()' on a null object reference
  at com.包名省略.mvp.ui.fragment.devices.DeviceOperationFragment.initData(DeviceOperationFragment.java:179)
  at com.jess.arms.base.a.g.b(FragmentDelegateImpl.java:74)
  at com.jess.arms.b.g.onFragmentActivityCreated(FragmentLifecycle.java:85)
  at android.support.v4.app.FragmentManagerImpl.dispatchOnFragmentActivityCreated(FragmentManager.java:3490)
  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1445)
  at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1752)
  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1821)
  at android.support.v4.app.BackStackRecord.executePopOps(BackStackRecord.java:855)
  at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2592)
  at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2382)
  at android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2337)
  at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2244)
  at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:783)
  at android.support.v4.app.FragmentationMagician$4.run(FragmentationMagician.java:134)
  at android.support.v4.app.FragmentationMagician.hookStateSaved(FragmentationMagician.java:194)
  at android.support.v4.app.FragmentationMagician.executePendingTransactionsAllowingStateLoss(FragmentationMagician.java:131)
  at me.yokeyword.fragmentation.k$15.a(TransactionDelegate.java:172)
  at me.yokeyword.fragmentation.b.b.a(ActionQueue.java:53)
  at me.yokeyword.fragmentation.b.b.b(ActionQueue.java:45)
  at me.yokeyword.fragmentation.b.b.a(ActionQueue.java:17)
  at me.yokeyword.fragmentation.b.b$1.run(ActionQueue.java:37)
  at android.os.Handler.handleCallback(Handler.java:792)
  at android.os.Handler.dispatchMessage(Handler.java:98)
  at android.os.Looper.loop(Looper.java:176)
  at android.app.ActivityThread.main(ActivityThread.java:6701)
  at java.lang.reflect.Method.invoke(Native Method)
  at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:246)
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:783)

Others:

问了群友,有的说是Dagger2注入的问题,我看了一下代码实在 onCreate 里面注入的,initData实在 onActivityCreate调用的,所以我觉得应该是已经注入的了,以下是相关源码

    // Dagger 依赖注入
    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        if (iFragment.useEventBus())//如果要使用eventbus请将此方法返回true
            EventBusManager.getInstance().register(mFragment);//注册到事件主线
        iFragment.setupFragmentComponent(ArmsUtils.obtainAppComponentFromContext(mFragment.getActivity()));
    }
   //  调用initData
  @Override
    public void onActivityCreate(@Nullable Bundle savedInstanceState) {
        iFragment.initData(savedInstanceState);
    }

子类实现注入方法:

    @Override
    public void setupFragmentComponent(@NonNull AppComponent appComponent) {
        DaggerDeviceOperationComponent //如找不到该类,请编译一下项目
                .builder()
                .appComponent(appComponent)
                .deviceOperationModule(new DeviceOperationModule(this))
                .build()
                .inject(this);
    }

麻烦作者帮忙看一下了,感激不尽

liuxuesong001 commented 5 years ago

您好,我是在Activity里边直接请求的数据,mPresenter 就报空指针,model 和view 直接就没绑定成功,不知道为什么。

Jackycai23237 commented 4 years ago

同问, @mny459 你这个问题解决了嘛

khy666 commented 3 years ago

Z41$JJ0`HLPQ_QVRRWMWG04 出现同样的问题,mPresenter总是空的

weioule commented 2 years ago

mPresenter 空指针的问题可以看看这里,不指定Application也会出现mPresenter为空的问题: 181404464-c4e72287-054d-4048-80d3-a1753a9f73bf