Приложение падает после получения телефонного звонка - PullRequest
3 голосов
/ 13 августа 2010

После того, как я получу телефонный звонок или сделаю его (и другие недокументированные прерывания), мое приложение получит исключение NullPointerException при возобновлении моей деятельности. Может ли кто-нибудь объяснить мне, где это и / или как это исправить? Когда моя деятельность возобновляется, она вызывает onCreate, кажется, и пытается выполнить что-то, что является нулевым после возобновления. Как предотвратить вызов onCreate ()?

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

EDIT:

Итак, как мне справиться? процесс убит -> onCreate ()? У меня есть действия A -> B -> C -> D, и я возвращаюсь обратно до A, проблем нет. Но если я запускаю другую программу, или другая программа выходит на передний план, D падает, затем C падает, затем B падает, затем A падает!

EDIT:

Я решил B, C, D сбой. Это было из-за того, что класс, в котором я хранил статические переменные, был уничтожен для освобождения ресурсов, и мои действия получали нулевые переменные.

Но когда я возвращаюсь к A, я получаю исключение classCastException:

08-13 16:52:10.456: ERROR/AndroidRuntime(6048): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.bookcessed.booksearch/com.bookcessed.booksearch.activities.ChooseProviderActivity}: java.lang.ClassCastException: android.view.AbsSavedState$1
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):     at android.app.ActivityThread.access$2300(ActivityThread.java:125)
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):     at android.os.Handler.dispatchMessage(Handler.java:99)
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):     at android.os.Looper.loop(Looper.java:123)
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):     at android.app.ActivityThread.main(ActivityThread.java:4627)
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):     at java.lang.reflect.Method.invokeNative(Native Method)
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):     at java.lang.reflect.Method.invoke(Method.java:521)
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):     at dalvik.system.NativeStart.main(Native Method)
08-13 16:52:10.456: ERROR/AndroidRuntime(6048): Caused by: java.lang.ClassCastException: android.view.AbsSavedState$1
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):     at android.widget.ProgressBar.onRestoreInstanceState(ProgressBar.java:944)
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):     at android.view.View.dispatchRestoreInstanceState(View.java:6138)
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):     at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:1209)
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):     at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:1209)
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):     at android.view.View.restoreHierarchyState(View.java:6117)
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):     at com.android.internal.policy.impl.PhoneWindow.restoreHierarchyState(PhoneWindow.java:1466)
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):     at android.app.Activity.onRestoreInstanceState(Activity.java:843)
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):     at android.app.Activity.performRestoreInstanceState(Activity.java:815)
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):     at android.app.Instrumentation.callActivityOnRestoreInstanceState(Instrumentation.java:1096)
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2641)
08-13 16:52:10.456: ERROR/AndroidRuntime(6048):     ... 11 more

Вот мой onCreate ():

super.onCreate(savedInstanceState);
        tempLayout = new RelativeLayout(ChooseProviderActivity.this);
        ProgressBar tempProgress = new ProgressBar(ChooseProviderActivity.this);
        tempProgress.setIndeterminate(true);
        tempProgress.setId(1); //I suspect this is the problem
        RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
                RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
        lp.addRule(RelativeLayout.CENTER_IN_PARENT);
        tempLayout.addView(tempProgress, lp);
        setContentView(tempLayout);

Я думаю, что здесь кроется проблема:

tempProgress.setId(1); //I suspect this is the problem

Ответы [ 7 ]

2 голосов
/ 13 августа 2010

Проверьте это изображение, чтобы увидеть, как и когда ОС будет вызывать ваше приложение. alt text

1 голос
/ 17 февраля 2012

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

1 голос
/ 14 августа 2010

Просто для разъяснения других людей, вам не нужно присваивать идентификаторы представлениям, которые вы создаете в коде.Таким образом, ваш код должен работать только с

ProgressBar tempProgress = new ProgressBar(ChooseProviderActivity.this);
tempProgress.setIndeterminate(true);
RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
                RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
lp.addRule(RelativeLayout.CENTER_IN_PARENT);
tempLayout.addView(tempProgress, lp);
setContentView(tempLayout);

Идентификаторы в основном только при установке идентификаторов в файлах XML, вы присваиваете ему строковый идентификатор, а затем R.java компилируется и присваиваеткаждому ресурсу свой идентификационный номер. Не совсем так!См. Редактирование!

РЕДАКТИРОВАТЬ

Как отмечалось в комментариях суперпользователей, вам нужны идентификаторы при работе с относительными макетами.Проверьте документы на RelativeLayout.LayoutParams.addRule (int, int), когда вам нужны идентификаторы.

END EDIT

Как это ...

LinearLayout ll = new LinearLayout(SomeClass.this);
ll.setOrientation(VERTICAL);
TextView tv = new TextView(SomeClass.this);
EditText et = new EditText(SomeClass.this);
ll.add(tv);
ll.add(et);

У этого будет textView выше представления EditText.В другом случае ... выполнение

ll.add(et);
ll.add(tv);

поместит EditText НАД TextView.Идентификаторы не имеют абсолютно никакого отношения к тому, как они расположены на экране.

1 голос
/ 13 августа 2010

Возможно, ваше приложение использует слишком много памяти, поэтому ОС Android убивает ее, чтобы получить достаточно памяти для запуска другого действия.

1 голос
/ 13 августа 2010

По какой-то причине ваше приложение закрывается, поэтому вызывается onCreate.Вы должны сохранить / возобновить состояние приложения, чтобы справиться с этим правильно.Взгляните на этот и справочник разработчиков

0 голосов
/ 14 августа 2010

Я использовал класс со статическими переменными и вызывал .getStoredStaticVariable() и .saveStoredStaticVariable(), и когда я пытался получить его, он был бы нулевым, возможно, потому что класс был уничтожен для освобождения ресурсов.

РЕДАКТИРОВАТЬ: Это было только частично решение.Решение ClassCastException() меняло

tempProgress.setId(1);

на число, которое вряд ли будет использоваться системой:

tempProgress.setId(6346346);
0 голосов
/ 13 августа 2010

Почему бы вам не попробовать переопределить все основные функции, которые используются в течение жизненного цикла действия.используйте adb logcat для log.v, где ваша ошибка происходит.Поместите один журнал после каждой строки в функции, в которой происходит сбой приложения.

И с чего вы звоните?ты звонишь с одного эмулятора на другой?У меня не было проблемы с существующим в таком случае журналом cat.

...