尝试在空对象引用上调用虚拟方法 '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);
和ViewPage
和Adapter
都不为空!!
我不得不提到,我的所有 Fragment
s 生命周期都在管理中,并且在适配器内部发生了 null 问题!当我使用 Activity
而不是 Fragment
作为父级时,同一个适配器工作正常!!!
【问题讨论】:
【参考方案1】:只需注释 super.onBackPressed() 方法并改为 finish()
@Override
public void onBackPressed()
// super.onBackPressed();
finish();
在我的情况下,这有效!
【讨论】:
它可能有效,但这是一个无意义的答案,因为当您可以轻松调用“finish()”而不是使用背压方法时,您正在覆盖“onBackPressed”行为【参考方案2】:我通过在我的Activity
的onBackPressed()
中添加!isFinishing
解决了这个问题。
override fun onBackPressed()
if (!isFinishing)
super.onBackPressed()
// your implementation specific code here..
在我的情况下,问题是通过一些代码流,我的 DialogFragment
在调用 finish()
之后调用其父 Activity
的 onBackPressed()
导致此崩溃。
如果有人仍在寻找答案,希望对您有所帮助!
【讨论】:
【参考方案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
我像这样覆盖我的FragmentPagerAdapter
的finishUpdate
方法,问题现在解决了!
@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()'的主要内容,如果未能解决你的问题,请参考以下文章
尝试在空对象引用上调用虚拟方法 com.google.firebase.iid.FirebaseInstanceId.getInstanceId()'
NullPointerException 错误尝试在空对象引用上调用虚拟方法错误
AsyncTask +数据库尝试在空对象引用上调用虚拟方法[重复]
数据库错误:尝试在空对象引用上调用虚拟方法“Cursor .getScene()”[重复]
尝试在空对象引用上调用虚拟方法 'android.view.SurfaceHolder android.view.SurfaceView.getHolder()'