2016-02-10 3 views
0

В моем приложении пользователь может запустить намерение камеры и сделать снимок и сохранить его в пользовательской папке. Затем они могут перезапустить камеру, чтобы сделать еще одно изображение и т. Д. Таким образом, пользователь может сделать несколько снимков.Bitmap OutOfMemoryException при загрузке фотографий

Проблема, с которой я сталкиваюсь, заключается в том, что в моей галерее, когда я пытаюсь загрузить все изображения в растровые изображения, чтобы разместить их в моем изображении, я получаю исключение java.lang.OutOfMemoryError. Я кое-что прочитал об управлении памятью, но я подумал, что понял это. Это то, что мой код выглядит до сих пор:

File folder = new File(dir + "/");//contains anything from 1-20 pictures 
File[] allPics = folder.listFiles(); 

private Bitmap[] thumbnails; 
private String[] arrPath; 

//load all the files into bitmaps to assign to my gridview adapter 
for (int i = 0; i < allPics.length; i++) { 
      thumbnails[i] = BitmapFactory.decodeFile(allPics[i].getAbsolutePath());//where the exception is thrown 

      arrPath[i]= allPics[i].getAbsolutePath(); 
     } 

StackTrace:

pcemobileapp E/AndroidRuntime: FATAL EXCEPTION: main 
Process: pcemobileapp, PID: 7069 
java.lang.OutOfMemoryError 
    at android.graphics.BitmapFactory.nativeDecodeStream(Native Method) 
    at android.graphics.BitmapFactory.decodeStreamInternal(BitmapFactory.java:719) 
    at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:695) 
    at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:452) 
    at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:491) 
    at pcemobileapp.CustomGalleryActivity.onCreate(CustomGalleryActivity.java:65) 
    at android.app.Activity.performCreate(Activity.java:5459) 
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1093) 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2364) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2458) 
    at android.app.ActivityThread.access$900(ActivityThread.java:172) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1305) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:146) 
    at android.app.ActivityThread.main(ActivityThread.java:5598) 
    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:1283) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099) 
    at dalvik.system.NativeStart.main(Native Method)) 
+1

Управление памятью в Android не очень просто. Вам придется кэшировать изображения и правильно управлять ими с помощью LRUCache, даже тогда вы столкнетесь с проблемами. Используйте загрузчик изображений Picasso, это очень легко, и это сэкономит вам много головных болей. – Pztar

+0

спасибо, я посмотрю. – john

+1

Довольно вероятно, что фото * намного * больше, чем 'ImageView' (или что-то еще), к которому вы его применяете. Используйте «BitmapFactory.Options» и 'inSampleSize', чтобы загрузить что-то более подходящее. Хорошая библиотека сделает это за вас; Я думаю, что Пикассо. – CommonsWare

ответ

2

Его довольно просто здесь. Вы все время декодируете кучу фотографий. Не делай этого. У вас недостаточно памяти даже на высокопроизводительном устройстве, если оно велико. Вместо этого сохраните расположение растрового изображения и только раздуйте растровое изображение в getView. Если это недостаточно эффективно, вы можете использовать кеш LRU и хранить последние N растровых изображений в памяти. Но вы не можете просто раздуть огромное количество изображений.

+0

, так что бы сохранить растровое изображение, сгенерированное камерой в db, лучше? Я подумал тогда о том, чтобы ограничить пользователя только 5 картинами, а затем – john

+1

Это не вопрос того, как было создано изображение. Это вопрос полного размера в памяти, когда они несжаты. Если изображение имеет ширину X и Y в пикселях, общая несжатая память не равна 4 * X * Y байтам. Но, контролируя, сколько из них в памяти за раз, вам нужен только фиксированный объем памяти, а не общая сумма всех изображений. –

Смежные вопросы