尝试在空对象引用上调用虚拟方法 'android.os.Handler android.support.v4.app.FragmentHostCallback.getHandler()'

Posted

技术标签:

【中文标题】尝试在空对象引用上调用虚拟方法 \'android.os.Handler android.support.v4.app.FragmentHostCallback.getHandler()\'【英文标题】:Attempt to invoke virtual method 'android.os.Handler android.support.v4.app.FragmentHostCallback.getHandler()' on a null object reference尝试在空对象引用上调用虚拟方法 'android.os.Handler android.support.v4.app.FragmentHostCallback.getHandler()' 【发布时间】:2017-05-29 18:38:05 【问题描述】:

我的应用程序包含 4 个片段作为标签,使用 FragmentPagerAdapter 在父片段中加载。

问题是当我运行应用程序并按下并重新打开应用程序时,我收到此错误日志:

FATAL EXCEPTION: main
java.lang.NullPointerException: Attempt to invoke virtual method 'android.os.Handler android.support.v4.app.FragmentHostCallback.getHandler()' on a null object reference
    at android.support.v4.app.FragmentManagerImpl.ensureExecReady(FragmentManager.java:1949)
    at android.support.v4.app.FragmentManagerImpl.execSingleAction(FragmentManager.java:1965)
    at android.support.v4.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:620)
    at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:143)
    at android.support.v4.view.ViewPager.setAdapter(ViewPager.java:513)
    ...

父Fragment里面的代码行是:

viewPager.setAdapter(adapter);
tabLayout.setupWithViewPager(viewPager);

ViewPageAdapter 都不为空!!

我不得不提到,我的所有 Fragments 生命周期都在管理中,并且在适配器内部发生了 null 问题!当我使用 Activity 而不是 Fragment 作为父级时,同一个适配器工作正常!!!

【问题讨论】:

【参考方案1】:

只需注释 super.onBackPressed() 方法并改为 finish()

@Override
public void onBackPressed() 
//     super.onBackPressed();
       finish();
  

在我的情况下,这有效!

【讨论】:

它可能有效,但这是一个无意义的答案,因为当您可以轻松调用“finish()”而不是使用背压方法时,您正在覆盖“onBackPressed”行为【参考方案2】:

我通过在我的ActivityonBackPressed() 中添加!isFinishing 解决了这个问题。

override fun onBackPressed() 
        if (!isFinishing)             
            super.onBackPressed()
            // your implementation specific code here..
        
    

在我的情况下,问题是通过一些代码流,我的 DialogFragment 在调用 finish() 之后调用其父 ActivityonBackPressed() 导致此崩溃。

如果有人仍在寻找答案,希望对您有所帮助!

【讨论】:

【参考方案3】:
@Override
public void onBackPressed() 
//     super.onBackPressed();
       finish();
  

覆盖活动中的onBackPressed.. 删除超级调用:super.onBackPressed 并调用完成。

【讨论】:

确定它会起作用吗?我有时会因为 onBackPressed() 出现错误 完全不知道为什么(技术上)......但它的工作原理! +1【参考方案4】:

我的项目也有同样的问题。但这是我的错。

为什么

在活动调用 onDestroy() 之后,我在回调中调用 onBackPressed;

因为在调用 onDestroy() 之后 FragmentManager 中的 mHost 实例设置为 null。

当调用 onBackPressed 时,它会再次使用 mHost 实例。

【讨论】:

【参考方案5】:

我使用了错误的活动引用来获取

getSupportFragmentManager()

使用正确的活动为我修复了崩溃。

【讨论】:

【参考方案6】:

我知道可能会迟到,但这是我没有立即看到的愚蠢错误:

@Override
public void onStop() 
    super.onDestroy(); //I was calling the wrong super

【讨论】:

【参考方案7】:

我遇到了同样的问题。就我而言,问题是我在重新使用时没有注意到上次打开的适配器。

我查看了发送异常的 FragmentManager.java 类,并且在崩溃的同一行上说: "必须从片段宿主的主线程调用"

我的代码是:

PagerAdapter adapter = MPageAdapter.getInstance(getSupportFragmentManager()); 
viewPager.setAdapter(adapter);

因为我使用 PageAdapter 作为在片段之间进行通信的桥梁,所以我使用了单例模式。这对我来说效果很好,但是一旦我在另一个活动中重复了这个结构,我就会遇到同样的异常。原因是我忘记在每次使用结束时销毁适配器类的单例。

@Override
protected void onDestroy() 
    MPageAdapter.Destroy();  //I forgot this one, that makes singleton = null;
    super.onDestroy();

【讨论】:

【参考方案8】:

我遇到了同样的问题,它是由片段的不同实例重用 ViewPager 实例引起的。一个解决方案是在片段的onDestroyView() 方法中将适配器清空。

@Override public void onDestroyView() 
    mViewPager.setAdapter(null);
    super.onDestroyView();

项目演示问题和解决方案can be found here。

【讨论】:

【参考方案9】:

经过大量研究,看起来是支持库问题:

Activity with fragment and ViewPager crashesh on configuration changeAndroid Support Library issue 24.1.0

我也找到了这个答案,但在我的代码中添加标志看起来很不寻常:

Attempt to invoke virtual method ‘android.os.Handler android.support.v4.app.FragmentHostCallback.getHandler()’ on a null object

我像这样覆盖我的FragmentPagerAdapterfinishUpdate 方法,问题现在解决了!

@Override
public void finishUpdate(ViewGroup container) 
    try
        super.finishUpdate(container);
     catch (NullPointerException nullPointerException)
        System.out.println("Catch the NullPointerException in FragmentPagerAdapter.finishUpdate");
    

有更好的答案吗?请告诉我...

【讨论】:

我也遇到了同样的问题,我会尝试这个修复,直到官方修复发布, 为我工作...谢谢。 这对我不起作用。有更好的解决方案吗?请告诉我。 这行得通!感谢您为此节省了更多时间。 :) 它发生在我身上,但我无法重现它。你如何重现它?

以上是关于尝试在空对象引用上调用虚拟方法 'android.os.Handler android.support.v4.app.FragmentHostCallback.getHandler()'的主要内容,如果未能解决你的问题,请参考以下文章

尝试在空对象引用上调用虚拟方法 'android.graphics.Rect android.graphics.drawable.Drawable.getBounds()'

尝试在空对象引用上调用虚拟方法 'android.view.Window$Callback android.view.Window.getCallback()'

尝试在空对象引用上调用虚拟方法 'android.os.Handler android.support.v4.app.FragmentHostCallback.getHandler()'

尝试在空对象引用上调用虚拟方法 'void android.view.View.measure(int, int)'

JPE:尝试在空对象引用上调用虚拟方法“android.content.res.Resources”

尝试在空对象引用上调用虚拟方法“void android.hardware.Camera.stopPreview()”