Попытка вызвать виртуальный метод "android.os.Handler android.support.v4.app.FragmentHostCallback.getHandler()" в ссылке на нулевой объект

Мое приложение состоит из 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)
    ...

строка кода внутри родительского фрагмента:

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

и ViewPage и Adapter оба значения не равны нулю.

Я должен упомянуть, что весь мой жизненный цикл Fragment управляется, и нулевая проблема происходит внутри адаптера!, и тот же адаптер работает нормально, когда я использую Activity как родительский, а не Fragment!!!

Ответы

Ответ 1

После много исследований, похоже, что это проблема с библиотекой поддержки:

Активность с фрагментом и ViewPager crashesh при конфигурации изменить
Версия библиотеки поддержки Android 24.1.0

Я также нашел этот ответ, но выглядит необычно, добавив флаг в мой код:

Попытка вызвать виртуальный метод 'android.os.Handler android.support.v4.app.FragmentHostCallback.getHandler() для нулевого объекта

Я переопределяю метод finishUpdate моего FragmentPagerAdapter, как это, и проблема решена на данный момент!

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

какой-нибудь лучший ответ? пожалуйста, дайте мне знать...

Ответ 2

У меня была такая же проблема. В моем случае проблема заключалась в том, что я повторно использовал, не заметив адаптер с предыдущего открытого времени.

Я заглянул в класс 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();
}

Ответ 3

У меня была такая же проблема, и это было вызвано повторным использованием экземпляра ViewPager разными экземплярами фрагмента. Решением было обнулить адаптер в onDestroyView() методе фрагмента.

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

Проект демонстрации проблемы и решения можно найти здесь.

Ответ 4

Я знаю, что может быть поздно, но здесь моя глупая ошибка, которую я сразу не видел:

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