У меня есть приложение, которое использует фотографии, хранящиеся на SD-карте или непосредственно на телефоне.ImageView в Android Causing App to Crash
У меня 2 деятельности, которые, кажется, возникли какие-то проблемы (Acitives для просмотра и редактирования записи). Одна запись ссылается на фотографию, сохраняя URI, который дает местоположение связанной фотографии.
Когда я нажимаю на мой взгляд деятельности, я прохожу URI, а затем установите ImageView с помощью URI. Когда внутри View Activity, у меня есть опция меню, которая позволяет вам выполнить Edit Activity. Когда вы нажимаете «Изменить», я снова передаю URI фотографии и устанавливаю ImageView с помощью URI. Оба эти мероприятия прекрасно отображаются сами по себе.
Однако, когда я нажимаю кнопку «Назад», чтобы перейти от «Редактировать для просмотра», приложение выйдет из строя. Первоначально авария была OutOfMemory Exception. Я прошел мимо этого исключения, добавив вызов в ((BitmapDrawable)mImageView.getDrawable()).getBitmap().recycle()
в функцию onPause в обоих действиях.
С кодом рециркуляции на месте, выполнение перемещается из Edit обратно в меню Вид, а затем просто падает где-то. Я прошел через функции жизненного цикла, и выполнение выполняется успешно, за исключением onCreate. Исполнение никогда не возвращается в CreateCreate.
Я знаю, что это что-то не связано с ImageView, потому что когда я удалить ImageView из макета в моей Вид деятельности, аварии больше не происходит.
Вот начальный трассировки стека, когда авария происходит:
Thread [<3> main] (Suspended (exception RuntimeException))
ViewRoot.draw(boolean) line: 1356
ViewRoot.performTraversals() line: 1097
ViewRoot.handleMessage(Message) line: 1613
ViewRoot(Handler).dispatchMessage(Message) line: 99
Looper.loop() line: 123
ActivityThread.main(String[]) line: 4203
Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) line: not available [native method]
Method.invoke(Object, Object...) line: 521
ZygoteInit$MethodAndArgsCaller.run() line: 791
ZygoteInit.main(String[]) line: 549
NativeStart.main(String[]) line: not available [native method]
После этого трассировки стека, если я продолжаю давить «Step Over» в Eclipse, трассировки стека заканчивается так:
Thread [<3> main] (Suspended)
ThreadGroup.uncaughtException(Thread, Throwable) line: 884
NativeStart.main(String[]) line: not available [native method]
Привет Януш, я ценю ответ. К сожалению, это не сработало для меня. Я все равно получаю тот же самый точный сбой при переходе с «Изменить обратно в режим просмотра». Я внесла следующие изменения: В onCreate я удалил настройку своего ImageView, и вместо этого я просто извлекаю и сохраняю URI для местоположения изображения. В onResume я добавил код для установки URI изображения на основе URI, который был сохранен в onCreate. Затем в onPause я вызываю переработку. – Michael
Причина, по которой я это делаю, объясняется потоком выполнения, который я наблюдал в отладчике, который выглядит следующим образом: после запуска приложения я перехожу от главной страницы к виду, который вызывает эти функции: onCreate(), а затем onResume(). Когда я перехожу из «Вид в редактирование», поток выглядит следующим образом: «Просмотр onPause» вызывается (вызывается рециркуляция). Перемещение из меню «Редактировать назад» в «Вид» с помощью кнопки «Назад» вызывается функция View's onResume (вызываемый setImageURI). Это выполняется нормально, но позже приложение сработает. Есть ли лучший способ очистить ImageView, чем переработать? – Michael
Еще одно наблюдение. Я захватил битмап, на который ссылается, вызывая ((BitmapDrawable) mImageView.getDrawable()). GetBitmap() и проверял адрес. Я заметил, что адрес был прежним до и после вызова на переработку. Я бы подумал, что после повторного использования адрес изменился бы. При возврате из «Правка» в «Вид» адрес является таким же. – Michael