2015-03-11 3 views
2

У меня есть группа мероприятий A-> B-> C-> D, и все они работают хорошо. Я тестировал их с помощью Интернета и без него, несколько конфигураций, и я заставил экран вращаться в каждом из них, чтобы увидеть, не сработают ли они. Они не сделалиAndroid: Необъяснимые сбои при повторном открытии приложения

Но на моем Android-телефоне (а не в эмуляторе) через некоторое время, когда приложение находится в фоновом режиме, если я открою его обратно (либо по отступникам, либо по моему главному меню), я получаю серию необъяснимые аварии. Это буквально происходит сбой D, идет на C. C сбой, идет на B. B сбой, идет к A. Аварии, сбрасываются и прекращаются. Это сводит меня с ума.

Это всегда NullPointerException на объектах, как эти из них:

java.lang.RuntimeException: Unable to start activity ComponentInfo{net.getfoodie.foodie/net.getfoodie.foodie.ui.exploremenu.MenuFragmentActivity}: java.lang.NullPointerException 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2305) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2363) 
at android.app.ActivityThread.access$900(ActivityThread.java:161) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1265) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:157) 
at android.app.ActivityThread.main(ActivityThread.java:5356) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:515) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081) 
at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:132) 
at dalvik.system.NativeStart.main(Native Method) 
Caused by: java.lang.NullPointerException 
at net.getfoodie.foodie.ui.exploremenu.MenuGridAdapter.<init>(MenuGridAdapter.java:71) 
at net.getfoodie.foodie.ui.exploremenu.MenuFragment.onActivityCreated(MenuFragment.java:75) 
at android.support.v4.app.Fragment.performActivityCreated(Fragment.java:1794) 
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:967) 
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1126) 
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1108) 
at android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:1917) 
at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:544) 
at net.getfoodie.foodie.ui.exploremenu.MenuFragmentActivity.onStart(MenuFragmentActivity.java:89) 
at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1189) 
at android.app.Activity.performStart(Activity.java:5436) 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278) 
... 12 more 

И, например, выше ошибка происходит из-за нулевой объект от синтаксического анализа SDK. Но объект уже был извлечен во время OnCreate активности, и, я думаю, он теряется при воссоздании активности? хотя я уверен, что забираю его в своем OnCreate(), и я проверил поворот?

Как вы думаете, из-за этого? Я что-то пропустил в своем жизненном цикле приложений?

И что еще более важно, как я могу вызвать «действие убить/спать» на моем эмуляторе Android, чтобы воспроизвести проблему и попытаться ее исправить?

+1

Можете ли вы опубликовать код из 'net.getfoodie.foodie.ui.exploremenu.MenuGridAdapter'? Там где-то есть пустое исключение. 'MenuFragment.onActivityCreated' также будет полезен. –

+0

@JamesMcCracken Я мог бы, но они довольно большие (здесь 500 строк кода). Дело в том, что каждый раз, когда я его исправляю, новый всплывает позже. Но я не могу вызывать эти ошибки на эмуляторе, это реальная проблема ... – Stephane

+0

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

ответ

1

Мероприятия, которые не отображаются на экране, часто блокируются Android для памяти. Когда вы вернетесь к Activity через recents, будет запущен самый последний вид активности, но если он будет убит, он не будет иметь контекста - он получит намерение, с которым он был запущен, но не имеет статических переменных или одиночных элементов, назначенных предыдущим значениям. Это вызывает проблемы для многих приложений. Решение состоит в том, чтобы либо разрешить любой активности каким-либо образом заполнить эти значения, либо обнаружить этот случай, и запустить соответствующее действие с CLEAR_TOP, чтобы убить старое состояние.

О, и для воспроизведения все, что вам нужно, это принудительная остановка из настроек менеджера активности. Перейдите в действие D, а затем остановите. Затем вернитесь через ответ.

В качестве примера - у меня есть приложение с LoginActivity и MainActivity. MainActivity предполагает, что LoginActivity настроил пользовательский синглтон. Мой код в MainActivity является:

public void onCreate(Bundle bundle){ 
    super.onCreate(bundle); 
    if(User.getCurrentUser() == null){ 
    Intent intent = new Intent(this, LoginActivity.class); 
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
    startActivity(intent); 
    finish(); 
    return; 
    } 
    //Continue on with onCreate for this activity 
} 

Это будет возобновить деятельность входа, если объект пользователя не был создан.

+0

это имеет смысл. У вас есть код, который иллюстрирует правильный способ реализации того, что вы описываете? – Stephane

+0

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