onResume() вызывается дважды подряд после onCreate() › onPause()

Я столкнулся со странным явлением в отношении методов жизненного цикла моей дочерней активности. Если я запускаю и закрываю действие достаточное количество раз, в конце концов наступает момент, когда по какой-то причине при запуске onPause вызывается сразу после onCreate (пропуская onResume), за которым затем следует onResume, вызываемый дважды подряд. Это приводит к RuntimeException в моем onResume.

Вот код, который запускает мою активность:

Intent intent = new Intent(MainActivity.this, RecorderActivity.class);
startActivityForResult(intent, AV_CAPTURE);

Мой onPause:

protected void onPause() {
    camera.stopPreview();
    camera.setPreviewCallback(null);
    camera.release();
    camera = null;
    super.onPause();
};

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

Я также, вероятно, должен упомянуть, что активность запускается из интерфейса Javascript, подключенного к WebView. Еще одна интересная вещь, о которой следует упомянуть, заключается в том, что установка точки останова в любом месте в первом блоке кода выше, похоже, предотвращает возникновение проблемы.


person Drazen Bjelovuk    schedule 28.05.2014    source источник
comment
Но действительно ли это проблема?   -  person Shlublu    schedule 28.05.2014
comment
Я имею в виду, что я, вероятно, мог бы обойти это, обернув Camera.open() в try catch, но мне действительно хотелось бы знать, что происходит.   -  person Drazen Bjelovuk    schedule 28.05.2014
comment
Понимаю. Пост @Uxonith имеет смысл, так как в любом случае исключения должны быть перехвачены. Я думаю, не будучи уверенным, что запуск/закрытие действий происходит слишком быстро, поэтому устройство перегружено.   -  person Shlublu    schedule 28.05.2014
comment
Хотя, кажется, не имеет значения, как быстро я это делаю.   -  person Drazen Bjelovuk    schedule 28.05.2014
comment
Странный. Я перечитал это, и кажется, что нет никакой гарантии, что onPause()/onResume() вызываются только один раз. Просто гарантией они называются, и просто ожиданием они являются один раз. developer.android.com/training/basics/activity-lifecycle/   -  person Shlublu    schedule 29.05.2014


Ответы (1)


Хотя у меня нет ответа на повторный вызов резюме, у меня есть ссылка на документы Android, в которой говорится, что вы всегда должны проверять исключения при попытке открыть камеру. Посмотреть здесь:

http://developer.android.com/guide/topics/media/camera.html#access-camera

В onPause убедитесь, что вы установили для объекта Camera значение null. Затем в onResume попытайтесь вызвать getCameraInstance() только в том случае, если ваша камера не равна нулю.

person Uxonith    schedule 28.05.2014