Мое приложение вылетает после долгой паузы и после onRestoreInstanceState

Хорошо, ребята, мне действительно нужна помощь. У меня есть опубликованное приложение Auto Inspection, и на моем Droid 4 в реальном мире я нажимаю физическую кнопку «Домой» на моем телефоне, приостанавливая приложение на некоторое время, оно вылетает, когда после onRestoreInstanceState вызывается. Максимум, что я могу понять, это фрагмент, к которому я возвращаюсь, имеет кнопку «Добавить новый автомобиль», которая обновляет следующий фрагмент при нажатии, как только эта кнопка нажата, происходит сбой. Я думаю, это потому, что состояние фрагмента третьего фрагмента потеряно. Приложение всегда работает идеально, пока оно не будет приостановлено на некоторое время. Вот моя трассировка стека:

    java.lang.NullPointerException
at pete01507.AutoInspection.af.a(Unknown Source)
at pete01507.AutoInspection.MainActivity.a(Unknown Source)
at pete01507.AutoInspection.ae.onClick(Unknown Source)
at android.view.View.performClick(View.java:4106)
at android.view.View$PerformClick.run(View.java:17052)
at android.os.Handler.handleCallback(Handler.java:615)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5059)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:792)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:555)
at dalvik.system.NativeStart.main(Native Method)

Любая помощь будет оценена по достоинству. Спасибо

Вот onRestoreInstanceState:

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    Log.d(TAG, "onRestoreInstanceState");
    if (savedInstanceState == null) {
        Log.d(TAG, "Restore onSaveInstanceState was empty");
        car="";
        fresh=false;
    }else{
        Log.d(TAG, "Restore onSaveInstanceState else was not empty");
        car = (String) savedInstanceState.get("car");
        load();
        mViewPager.setCurrentItem(savedInstanceState.getInt("vp"));
    }
    }

Вот состояние onSaveInstanceState:

    @Override
    public void onSaveInstanceState(Bundle savedInstanceState) {
    super.onSaveInstanceState(savedInstanceState);
    Log.d(TAG, "onSaveInstanceState");
    if (car.equals("")){
        Log.d(TAG, "onSaveInstanceState car not loaded");
    } else {
        Log.d(TAG, "onSaveInstanceState car is loaded");
        savedInstanceState.putString("car", car);
        savedInstanceState.putInt("vp", mViewPager.getCurrentItem());
    }
    }

Обновление: у меня есть MainActivity с семью статическими фрагментами на ViewPager, у действия нет представлений или страниц, поэтому, когда приложение запускается, первая страница является первым фрагментом. Я удалил все обращения к интерфейсу обратного вызова для обновления третьего фрагмента при нажатии кнопки "+ New Vehicle" эта кнопка находится во втором фрагменте. Теперь приложение работает без сбоев, но нет обновления фрагмента №3. Интерфейсы обратного вызова по-прежнему будут обновлять первый фрагмент, но не третий по какой-то причине, которую я еще не понял, после того, как приложение убито Android, у которого мало памяти, и вы снова щелкаете приложение, чтобы использовать его третий и отдых фрагментов больше не доступны через интерфейсы. Итак, как мне восстановить фрагменты, например, когда приложение запускается при первой его установке или в этом приложении есть кнопка выхода, которая вызывает context.finish после нажатия кнопки выхода, интерфейсы снова работают?


person Pete    schedule 28.11.2015    source источник
comment
Можете ли вы поделиться соответствующим источником (onRestoreInstanceState)? Нам нужно больше контекста, чтобы увидеть, что происходит. Ваша запутанная трассировка стека нам ничего не говорит.   -  person rharter    schedule 28.11.2015
comment
Конечно. при нажатии кнопки также задействован интерфейс обратного вызова.   -  person Pete    schedule 28.11.2015
comment
Также, если я закомментирую вызов интерфейса обратного вызова, он не сработает, но фрагменты не будут обновляться, когда он не вызывается. Мой сбой напрямую связан с вызовом интерфейса обратного вызова. Опять же, это происходит только после паузы на некоторое время.   -  person Pete    schedule 28.11.2015
comment
Можешь поделиться своим onSaveInstanceState ?   -  person BananaBuisness    schedule 28.11.2015
comment
Трудно определить с помощью запутанной трассировки стека. Можете ли вы запустить это в сборке без proguard, чтобы получить трассировку стека с номерами строк, чтобы вы могли точно определить строку, вызывающую ошибку?   -  person rharter    schedule 28.11.2015
comment
Что ж, я не могу эмулировать с помощью своего Droid 4, потому что драйвер вызывает неисправимый сбой моего компьютера на синем экране, а эмулятор Android Studio никогда не дает сбоев. и никто другой не сообщил об этом сбое, кроме меня. Я новичок в разработке приложений с помощью Android Studio, может быть, я просто не понимаю, о чем вы просите?   -  person Pete    schedule 28.11.2015


Ответы (1)


Жаль, что я не могу комментировать, потому что я не уверен в этом, но! Я помню, что у меня была похожая проблема, и это звучит знакомо для меня. Итак, я открыл свой исходный код двух- или трехлетней давности одного приложения, которое я сделал. И там был комментарий, который я написал.

Если приложение переводится в фоновый режим с помощью кнопки «Домой», а Android получает нехватку оперативной памяти, оно убивает приложение, но сохраняет стек активности и состояние экземпляра в пакет. Когда приложение открывается снова, оно не запускает действие средства запуска, но последнее, которое было в стеке действий, и значения, которые были переданы ему из другого действия, теряются.

Итак, разве вы не ожидаете, что некоторые значения не будут нулевыми в onCreate или где-то еще, вызывающем getIntent(), в одном из ваших действий?

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

person hocikto    schedule 28.11.2015
comment
Да, возможно, это то, что происходит, но у меня есть только одно действие. Есть ли способ перезапустить MainActivity? Это все, что мне нужно было сделать, и я пробовал несколько подходов к перезапуску MainActivity, но все они потерпели неудачу. Спасибо за Ваш ответ! - person Pete; 29.11.2015
comment
Я некоторое время не работал с Android, но думаю, что решил эту проблему, имея статическую конечную строку, значение которой загружается из файла настроек. Я проверял, имеет ли эта строка значение. Если нет, я запускал основную активность и убивал ту, которая была загружена. Я сделал эту проверку, прежде чем проверять, является ли saveInstanceState нулевым... Это сработало. И вы тоже можете сделать это, потому что запуск той же активности не должен быть проблемой, просто убедитесь, что вы убили старую, поэтому нажатие кнопки «Назад» не является проблемой. - person hocikto; 29.11.2015