我如何在 ArrayList 中存储大位图

how can i store store large Bitmaps in a 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();
                             }  
                        }

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

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

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

如果您需要将图像保留传递给 activity,那么如果您可以更改 activity,则最好将文件路径传递给它。

否则,您将需要重新读取具有更高样本大小的位图,以便它们更小但消耗更少的内存。

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

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

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