Ошибка памяти при загрузке растровых изображений
У меня есть приложение для Android с 3 ацитивами:
A1 – начинается -> A2 – начинается -> A3 – по завершении процесса: начинается -> A1
(поэтому я не «заканчиваю» (), «приложение. Я запускаю следующие действия с« startActivity (..) »,« все время после пользовательского взаимодействия »)
- Как удалить простыню вокруг кнопок в Android?
- как изменить фоновое изображение кнопки при нажатии / фокусировке?
- Android: Как растянуть изображение до ширины экрана при сохранении пропорций?
- Использование цвета и color.darker в Android?
- Как изменить цвет изображения растрового изображения в Android?
поэтому в этих трех действиях есть цикл. В каждой операции я показываю 3-9 изображений, расположенных на SD-карте, которую я загружаю с помощью следующей функции:
try { Uri selectedImageURI = Uri.parse(strImagePath); File imgFile = new File(getRealPathFromURI(selectedImageURI, c)); Bitmap myBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath()); ivTmp.setImageBitmap(myBitmap); }catch (Exception e) { return null; }
Все это работает. Но иногда (после нескольких циклов по моей активности) мое приложение падает.
Логкат говорит мне:
01-16 13:42:15.863: DEBUG/dalvikvm(23161): GC_BEFORE_OOM freed 10K, 9% free 59019K/64400K, paused 29ms, total 30ms 01-16 13:42:15.863: ERROR/dalvikvm-heap(23161): Out of memory on a 8018704-byte allocation. 01-16 13:42:15.863: ERROR/AndroidRuntime(23161): FATAL EXCEPTION: main java.lang.OutOfMemoryError at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method) at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:502) at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:355) at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:785) at android.content.res.Resources.loadDrawable(Resources.java:1965) at android.content.res.Resources.getDrawable(Resources.java:660) at android.widget.ImageView.resolveUri(ImageView.java:616) at android.widget.ImageView.setImageResource(ImageView.java:349) at .MyActivity$6.run(MyActivity.java:143) at android.os.Handler.handleCallback(Handler.java:725) at android.os.Handler.dispatchMessage(Handler.java:92) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:5039) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) at dalvik.system.NativeStart.main(Native Method)
Кто-то может дать мне несколько советов, как справляться с авариями? Может быть, потому, что мои действия настроены на состояние «приостановлено», а не закрывать их правильно?
- Маскирование (обрезка) изображения в кадре
- Не удалось добавить окно [email protected] - разрешено разрешение для этого типа windows
- В андроидном приложении Toolbar.setTitle метод не действует - имя приложения отображается как заголовок
- Google Maps v2 Маркер zOrdering - установить в начало
- Растровые изображения в Android
- Загрузить значение измерения из res / values / dimension.xml из исходного кода
- Как создать текстовый файл и вставить данные в этот файл на Android
- Как проверить подключение к Интернету в Android?
для быстрого исправления вы можете добавить
android:largeHeap="true"
в вашем ярлыке приложения-приложения
ссылка здесь:
Я столкнулся с проблемой OOM для моего стола в разжигании и укупе
Heap size (large) android:largeHeap="true"
там упоминается спецификация, чтобы использовать большую ссылку на кучу :
edit: используйте ссылку Caching Bitmaps
У меня была аналогичная проблема при отображении изображений с высоким разрешением. Я искал и применял все растровые решения андроида, приведенные в http://developer.android.com/training/displaying-bitmaps/index.html, а также следующие мешанины кешей в ссылке. но никто из них не работает. не любое правильное решение в любом месте. Затем я понял, что проблема в том, что я не мог правильно использовать структуру выпадающих папок. Я сохранял изображения с высоким разрешением в папках mdpi и hdpi. эта причина андроида увеличивает изображения до ультра размеров. Изображение размером 100 кб вызывало увеличение памяти на 20 мб благодаря блоку / монитору памяти. поэтому я добавил эти изображения с ультраразрешением в папку xxhdpi, затем он был FIXED неожиданно. тогда мой слайдер изображения работает безупречно
Да, андроид не сразу уничтожает действия, когда они не видны пользователю, но существует ряд методов жизненного цикла, вызываемых в зависимости от текущего состояния. Ознакомьтесь с http://developer.android.com/guide/components/activities.html#Lifecycle
Вы можете попробовать завершить операции в onStop () или onDestroy (), поскольку они будут вызываться, когда активность не видна и когда система работает на памяти соответственно. 🙂
Это связано с высоким разрешением изображения, которое вы должны масштабировать растровым изображением, используя следующий код
Bitmap myBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath()); int h = 100; // height in pixels int w = 100; // width in pixels Bitmap photoBitMap = Bitmap.createScaledBitmap(myBitmap,h, w, true); ivTmp.setImageBitmap(photoBitMap);