Android 4.4.2 - java.lang.RuntimeException: выполнение остановки активности, которая не возобновляется
Я получаю это исключение на устройстве 4.4.2. Не воспроизводится на устройстве Android 4.3 или ниже.
У меня есть домашняя активность (подкласс поддержки ActionBarActivity
). Домашняя активность проверяет логический флаг, и если true, запускает активность заставки (да, в идеале, всплеск появляется перед домашней активностью, но предположим, что я не могу изменить его, чтобы работать так на данный момент).
Заставка запускается с помощью startActivityForResult
, она загружает некоторые параметры конфигурации с сервера, а затем заканчивает и возвращает результат обратно в домашнюю активность.
Странно, что это работает отлично на 4.3 и ниже, но на 4.4 устройствах я получаю вышеописанное исключение (полная трассировка стека):
02-21 13:36:16.733 24409-24409/test.player E/ActivityThread﹕ Performing stop of activity that is not resumed: {test.player/test.ui.actvities.HomeActivity}
java.lang.RuntimeException: Performing stop of activity that is not resumed: {test.player/test.ui.actvities.HomeActivity}
at android.app.ActivityThread.performStopActivityInner(ActivityThread.java:3147)
at android.app.ActivityThread.handleStopActivity(ActivityThread.java:3234)
at android.app.ActivityThread.access$1100(ActivityThread.java:135)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1223)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5017)
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:779)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
at dalvik.system.NativeStart.main(Native Method)
Исходя из вышесказанного, похоже, что onStop (потому что я запускаю действие всплеска на onCreate) вызывается перед onResume для главной операции.
Почему это теперь вызывает проблемы в 4.4.x?
Ответы
Ответ 1
Это не кажется мне правильным. Активность всплеска теперь будет главной активностью в стеке, поэтому метод жизненного цикла HomeActivity
onStop будет вызван в конечном итоге. Кстати, я переместил вызов startActivity
для активности всплеска от onCreate
до onResume
в HomeActivity
, и ошибка исчезла.
Ответ 2
Проблема будет по-прежнему присутствовать на всех телефонах HighEnd с 4.4.2 и выше, включая NEXUS 5, Samsumg s4, поскольку onResume вызывается, но все же он находится в стадии анимации. Поэтому, если вы попытаетесь начать работу в onResume, проблема будет реплицировать.
Поместите свою активность переключения в метод задержанного обработчика.
Handler handler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
switch (msg.what) {
case 1:
//Strat another Activity Here
default:
break;
}
return false;
}
});
И в onResume вызовите это.
handler.sendEmptyMessageDelayed(1, 1000);
К этому времени вы можете показать загрузчик или что-то или заблокировать взаимодействие с пользователем
Ответ 3
Просто вызовите метод overResume super перед запуском нового действия:
super.onResume();
Ответ 4
Я получал это исключение даже при использовании onResume()
, поэтому я закончил переопределение onPostResume()
и начал работу там, и исключение исчезло. Не уверен, что это идеальное решение, но все же...