如何在ArrayList中存储大型位图

时间:2015-02-12 05:23:37

标签: java android arraylist

我正在以这种方式使用下面的代码,但是当我将图像添加到ArrayList后,我的应用程序崩溃并且内存不足错误

                    ArrayList<Bitmap> rev = new ArrayList<Bitmap>(10000);
                    for (long i = 1000000; i < millis * 1000; i += 1000000) 
                    {

                            finalBitmap = retriever.getFrameAtTime(i,MediaMetadataRetriever.OPTION_CLOSEST_SYNC);
                            rev.add(finalBitmap);
                            try
                            {
                                ByteArrayOutputStream bytes = new ByteArrayOutputStream();
                                finalBitmap.compress(Bitmap.CompressFormat.PNG, 40, bytes);
                                File f = new File(saveFolder, ("img0"+j+".png"));
                                f.createNewFile();
                                FileOutputStream fo = new FileOutputStream(f);
                                fo.write(bytes.toByteArray());
                                fo.flush();
                                fo.close();
                                j++;
                            }
                             catch (IOException e) 
                             {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                             }  
                        }

2 个答案:

答案 0 :(得分:0)

由于内存有限,您将无法直接引用每个图像,否则就像您说的那样,内存不足。只要存在对BitMap对象的引用,这些图像将占用内存中的空间。要释放此内存,您需要取消引用这些BitMaps和/或清除ArrayList,这将允许垃圾收集器释放未使用的内存。理想情况下,您只需要参考您可以看到的图像,或者您将看到的图像。

您可以查看每个页面视图的8个图像,或者查看周围页面视图中的图像。如果您显示的图像比它们占用的图像大得多,那么您可能希望动态调整这些图像的大小并仅将它们存储为它们出现的大小,这也应该有助于减少图像的内存占用。

Android开发人员只针对此主题编写了一系列教程:http://developer.android.com/training/displaying-bitmaps/index.html

答案 1 :(得分:0)

如果您需要将图像保留到活动中,那么如果您可以更改活动,则最好不要向其发送文件路径。

否则,您需要使用new来读取具有较高样本大小的位图,以便它们更小但消耗更少的内存。

http://developer.android.com/training/displaying-bitmaps/load-bitmap.html#load-bitmap

您可以使用4 * width * height来确定位图在内存中的大小,并使用它来确定您将分配多少内存。

使用BitmapFactory.Option.inJustDecodeBounds获取位图的大小而不加载它