Почему NPE выбрасывается при завершении действия? - PullRequest
4 голосов
/ 21 июля 2011

У меня ошибка, которая сводила меня с ума в течение нескольких дней.К сожалению, я не могу показать вам код по двум причинам, мой начальник не оценит его, а кодовая база слишком велика, чтобы делиться ею.Ошибка возникает всякий раз, когда действие заканчивается.Это может быть из-за того, что я вызываю finish () или потому что os уничтожает его.

Вопрос в том, что (или может) вызвать execPendingActions () в FragmentManagerImpl, чтобы бросить NPE в строке 1196.

Вот трассировка стека:

FragmentManagerImpl.execPendingActions() line: 1196 
FragmentManagerImpl$1.run() line: 375   
Handler.handleCallback(Message) line: 587   
Handler.dispatchMessage(Message) line: 92   
Looper.loop() line: 126 
ActivityThread.main(String[]) line: 3997    
Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) line: not available [native method]  
Method.invoke(Object, Object...) line: 491  
ZygoteInit$MethodAndArgsCaller.run() line: 841  
ZygoteInit.main(String[]) line: 599 
NativeStart.main(String[]) line: not available [native method]  

Ответы [ 4 ]

2 голосов
/ 25 июля 2011

Возможно, вы сталкиваетесь с ошибкой в ​​диспетчере фрагментов, когда он не очищает свой список ожидающих транзакций перед уничтожением.Это может произойти, если вы фиксируете транзакцию после сохранения своего состояния с помощью FragmentTransaction.commitAllowingStateLoss ().Вы можете обойти это с помощью этого кода в своей деятельности:

@Override void onDestroy() {
    getFragmentManager().executePendingTransactions();
    super.onDestroy();
}
2 голосов
/ 23 июля 2011

Говоря о завершении действий: вы пытаетесь finish() выполнить действие из представления? Правильно ли отправляется MyClass.this.finish()?

Мне кажется, что ОС заставляет его закрыться из-за NPE. Что-то не так с фрагментами. Среди них что-то пустое. Не могли бы вы хотя бы вставить строку, где он падает?

1 голос
/ 28 июля 2011

Вы можете попробовать использовать библиотеку compat и отладить ее.

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

0 голосов
/ 09 июля 2015

Исключение NullPointerException вызвано тем, что обработчик Activity не установлен в FragmentManager, поэтому «решение», которое предотвратит сбой, будет следующим:

public void onDestroy(){ 
        super.onDestroy(); 
        try { 
            Field mActivityField = getFragmentManager().getClass().getDeclaredField("mActivity");
            mActivityField.setAccessible(true);
            mActivityField.set(getFragmentManager(), this);

            Field mPendingActionsField = getFragmentManager().getClass().getDeclaredField("mPendingActions");
            mPendingActionsField.setAccessible(true);
            mPendingActionsField.set(getFragmentManager(), null);


            Field f = Activity.class.getDeclaredField("mHandler");
            f.setAccessible(true);
            Handler handler = (Handler) f.get(this);
            handler.close(); 
        } catch (Throwable e) {

        } 
} 
...