尝试在空 object 引用上调用虚拟方法 '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
我的应用程序由 4 个片段组成,作为使用 FragmentPagerAdapter
.
在 parent 片段中加载的选项卡
问题是当我 运行 应用程序并按返回键和 re-open 应用程序时,我收到此错误日志:
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)
...
parent 片段中的代码行是:
viewPager.setAdapter(adapter);
tabLayout.setupWithViewPager(viewPager);
和ViewPage
和Adapter
都不为空!!
我不得不提一下,我所有的 Fragment
生命周期都在管理中,适配器内部发生了 null 问题!当我使用 Activity
时,同一个适配器工作正常parent 而不是 Fragment
!!!
经过大量研究,看起来是支持库的问题:
Activity with fragment and ViewPager crashesh on configuration
change
Android Support Library issue 24.1.0
我也找到了这个答案,但是在我的代码中添加一个标志看起来很不寻常:
我重写了 FragmentPagerAdapter
的 finishUpdate
方法,问题暂时解决了!
@Override
public void finishUpdate(ViewGroup container) {
try{
super.finishUpdate(container);
} catch (NullPointerException nullPointerException){
System.out.println("Catch the NullPointerException in FragmentPagerAdapter.finishUpdate");
}
}
还有更好的答案吗?请让我知道...
我有同样的问题,这是由片段的不同实例重用 ViewPager
实例引起的。一个解决方案是在片段的 onDestroyView()
方法中使适配器无效。
@Override public void onDestroyView() {
mViewPager.setAdapter(null);
super.onDestroyView();
}
演示问题和解决方案的项目 can be found here。
我遇到了同样的问题。在我的例子中,问题是我在没有注意到上次打开的适配器的情况下重新使用。
我查看了发送异常的 FragmentManager.java class 并且在崩溃的同一行上说:
"Must be called from main thread of fragment host"
我的代码是:
PagerAdapter adapter = MPageAdapter.getInstance(getSupportFragmentManager());
viewPager.setAdapter(adapter);
因为我使用 PageAdapter 作为片段之间通信的桥梁,所以我使用了单例模式。这对我来说效果很好,但是一旦我在另一个 activity 中重复这个结构,我得到了同样的异常。原因是我忘记在每次使用结束时销毁适配器 class 的单例。
@Override
protected void onDestroy() {
MPageAdapter.Destroy(); //I forgot this one, that makes singleton = null;
super.onDestroy();
}
我知道可能会晚了,但这是我没有立即看到的愚蠢错误:
@Override
public void onStop() {
super.onDestroy(); //I was calling the wrong super
}
我使用了错误的 activity 引用来获取
getSupportFragmentManager()
使用正确的 activity 解决了我的崩溃问题。
我的项目也有同样的问题。但这是我的错。
为什么
我在 activity 调用 onDestroy() 之后在回调中调用 onBackPressed;
因为调用onDestroy()后FragmentManager中的mHost实例被设置为null
并且当调用 onBackPressed 时它将再次使用 mHost 实例。
@Override
public void onBackPressed() {
// super.onBackPressed();
finish();
}
覆盖 activity 中的 onBackPressed
..
删除超级调用:super.onBackPressed
并调用 finish。
我通过在 Activity
的 onBackPressed()
中添加 !isFinishing
来解决它。
override fun onBackPressed() {
if (!isFinishing) {
super.onBackPressed()
// your implementation specific code here..
}
}
我的问题是通过一些代码流,我的 DialogFragment
在调用 finish()
之后调用其父 Activity
的 onBackPressed()
导致了这次崩溃.
如果有人仍在寻找答案,希望对您有所帮助!
只需注释 super.onBackPressed() 方法并编写 finish() 代替
@Override
public void onBackPressed() {
// super.onBackPressed();
finish();
}
在我的例子中,这有效!
我的应用程序由 4 个片段组成,作为使用 FragmentPagerAdapter
.
问题是当我 运行 应用程序并按返回键和 re-open 应用程序时,我收到此错误日志:
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)
...
parent 片段中的代码行是:
viewPager.setAdapter(adapter);
tabLayout.setupWithViewPager(viewPager);
和ViewPage
和Adapter
都不为空!!
我不得不提一下,我所有的 Fragment
生命周期都在管理中,适配器内部发生了 null 问题!当我使用 Activity
时,同一个适配器工作正常parent 而不是 Fragment
!!!
经过大量研究,看起来是支持库的问题:
Activity with fragment and ViewPager crashesh on configuration change
Android Support Library issue 24.1.0
我也找到了这个答案,但是在我的代码中添加一个标志看起来很不寻常:
我重写了 FragmentPagerAdapter
的 finishUpdate
方法,问题暂时解决了!
@Override
public void finishUpdate(ViewGroup container) {
try{
super.finishUpdate(container);
} catch (NullPointerException nullPointerException){
System.out.println("Catch the NullPointerException in FragmentPagerAdapter.finishUpdate");
}
}
还有更好的答案吗?请让我知道...
我有同样的问题,这是由片段的不同实例重用 ViewPager
实例引起的。一个解决方案是在片段的 onDestroyView()
方法中使适配器无效。
@Override public void onDestroyView() {
mViewPager.setAdapter(null);
super.onDestroyView();
}
演示问题和解决方案的项目 can be found here。
我遇到了同样的问题。在我的例子中,问题是我在没有注意到上次打开的适配器的情况下重新使用。
我查看了发送异常的 FragmentManager.java class 并且在崩溃的同一行上说: "Must be called from main thread of fragment host"
我的代码是:
PagerAdapter adapter = MPageAdapter.getInstance(getSupportFragmentManager());
viewPager.setAdapter(adapter);
因为我使用 PageAdapter 作为片段之间通信的桥梁,所以我使用了单例模式。这对我来说效果很好,但是一旦我在另一个 activity 中重复这个结构,我得到了同样的异常。原因是我忘记在每次使用结束时销毁适配器 class 的单例。
@Override
protected void onDestroy() {
MPageAdapter.Destroy(); //I forgot this one, that makes singleton = null;
super.onDestroy();
}
我知道可能会晚了,但这是我没有立即看到的愚蠢错误:
@Override
public void onStop() {
super.onDestroy(); //I was calling the wrong super
}
我使用了错误的 activity 引用来获取
getSupportFragmentManager()
使用正确的 activity 解决了我的崩溃问题。
我的项目也有同样的问题。但这是我的错。
为什么
我在 activity 调用 onDestroy() 之后在回调中调用 onBackPressed;
因为调用onDestroy()后FragmentManager中的mHost实例被设置为null
并且当调用 onBackPressed 时它将再次使用 mHost 实例。
@Override
public void onBackPressed() {
// super.onBackPressed();
finish();
}
覆盖 activity 中的 onBackPressed
..
删除超级调用:super.onBackPressed
并调用 finish。
我通过在 Activity
的 onBackPressed()
中添加 !isFinishing
来解决它。
override fun onBackPressed() {
if (!isFinishing) {
super.onBackPressed()
// your implementation specific code here..
}
}
我的问题是通过一些代码流,我的 DialogFragment
在调用 finish()
之后调用其父 Activity
的 onBackPressed()
导致了这次崩溃.
如果有人仍在寻找答案,希望对您有所帮助!
只需注释 super.onBackPressed() 方法并编写 finish() 代替
@Override
public void onBackPressed() {
// super.onBackPressed();
finish();
}
在我的例子中,这有效!