В моем приложении пользователь может запустить намерение камеры и сделать снимок и сохранить его в пользовательской папке. Затем они могут перезапустить камеру, чтобы сделать еще одно изображение и т. Д. Таким образом, пользователь может сделать несколько снимков.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))
Управление памятью в Android не очень просто. Вам придется кэшировать изображения и правильно управлять ими с помощью LRUCache, даже тогда вы столкнетесь с проблемами. Используйте загрузчик изображений Picasso, это очень легко, и это сэкономит вам много головных болей. – Pztar
спасибо, я посмотрю. – john
Довольно вероятно, что фото * намного * больше, чем 'ImageView' (или что-то еще), к которому вы его применяете. Используйте «BitmapFactory.Options» и 'inSampleSize', чтобы загрузить что-то более подходящее. Хорошая библиотека сделает это за вас; Я думаю, что Пикассо. – CommonsWare