我正在尝试将位图列表保存到文件中。基本上,我想将其存储以供将来参考,以便当用户从图库中选择图像时,即使应用关闭,它也会保留在那里。
这是我想要做的?但是得到了一些Exception-BufferUnderFlowException,OutOfMemoryException。问题似乎是Bitmap List的内存非常大。有没有更好的方法呢?
final List<Bitmap> bitmapcontent=new ArrayList<Bitmap>();
ImageView imageView;
Gallery gallery;
private static byte[] bytesar;
ByteBuffer dst;
private void savethebitmap() throws IOException, ClassNotFoundException {
try {
FileOutputStream fos = openFileOutput("bitmapimage", Context.MODE_PRIVATE);
ObjectOutputStream out=new ObjectOutputStream(fos);
out.writeInt(bitmapcontent.size());
for(int i=0;i<bitmapcontent.size();i++){
out.writeInt(bitmapcontent.get(i).getRowBytes());
out.writeInt(bitmapcontent.get(i).getHeight());
out.writeInt(bitmapcontent.get(i).getWidth());
int bmSize = bitmapcontent.get(i).getRowBytes() * bitmapcontent.get(i).getHeight();
if(dst==null || bmSize > dst.capacity())
dst= ByteBuffer.allocate(bmSize);
out.writeInt(dst.capacity());
dst.position(0);
bitmapcontent.get(i).copyPixelsToBuffer(dst);
if(bytesar==null || bmSize > bytesar.length)
bytesar=new byte[bmSize];
dst.position(0);
dst.get(bytesar);
out.write(bytesar, 0, bytesar.length);
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private void loadthebitmap() throws IOException,ClassNotFoundException{
try {
freeBitmaps();
FileInputStream fos = openFileInput("bitmapimage");
ObjectInputStream in=new ObjectInputStream(fos);
int size=in.readInt();
for(int i=0;i<size;i++){
int height=in.readInt();
int width=in.readInt();
int bmSize=in.readInt();
if(bytesar==null || bmSize > bytesar.length)
bytesar= new byte[bmSize];
int offset=0;
while(in.available()>0){
offset=offset + in.read(bytesar, offset, in.available());
}
if(dst==null || bmSize > dst.capacity())
dst= ByteBuffer.allocate(bmSize);
dst.position(0);
dst.put(bytesar);
dst.position(0);
Bitmap myVideoScreenshotBm=Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
myVideoScreenshotBm.copyPixelsFromBuffer(dst);
bitmapcontent.add(myVideoScreenshotBm);
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
答案 0 :(得分:0)
arraylist可能太大而堆无法处理它。尝试使用以下命令启动VM:
-Xmx2G -Xms1G
-Xmx代表最大内存,-Xms代表开始时分配的内存。 G代表GB,M代表MB。
在上面的评论中回复G_S,似乎他已使用ObjectOutputStream
来序列化arraylist。
编辑:
如果设备没有太多内存,您可能需要尝试将位图分解成碎片,例如块。
答案 1 :(得分:0)
out.writeObject(bitmapContent)
和鲍勃(应该)是你的叔叔...如果你的内存不足,请使用建议来增加你的内存大小。还有further tips。一切顺利,让我知道你是怎么过的。
答案 2 :(得分:0)
ObjectOutputStream
缓存写入它的对象。因此,要么使用简单DataOutputStream
,要么致电ObjectOutputStream.reset
out.write(bytesar, 0, bytesar.length);
out.flush();
out.reset();