我想制作图像备份,因为我使用sqlite DataBase存储图像我的代码工作正常,当我放置10到12个图像,但之后它显示OutOfMemoryError。我使用android:largeHeap =“true”它会增加一些内存但这对我的工作来说还不够。我可以解决这个问题吗?请帮帮我们。
这是我的代码:
if(data==null){
Uri uri = data.getData();
try {
InputStream inputStream = getContentResolver().openInputStream(uri);
BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
Bitmap bmp = BitmapFactory.decodeStream(bufferedInputStream);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.PNG, 100, bos);
byte[] bArray = bos.toByteArray();
DataBase dataBase=new DataBase(getBaseContext());
dataBase.insertImage(bArray);
Toast.makeText(getBaseContext(),"single item ",Toast.LENGTH_LONG).show();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
答案 0 :(得分:1)
当图像非常大时会发生这种情况。你可以用Jpg中的油漆保存图像,并以这种方式减小尺寸。尝试使用不同尺寸,直到其中一个工作。
答案 1 :(得分:0)
您没有向我们展示围绕此代码段的代码,即“如何管理检索到的数据”。例如,您可能会发现不可能(!)同时在内存中保存“10或12个图像”... 和-d-d 每个设备都会有所不同! (作为开发人员,您自然会购买“装备”设备,而您的实际客户在杂货店购买了她的手机。)您将不得不设计某种方案,仅将最近检索到的图像存储在内存中
一种可能的策略是将这些图像存储在对象中保存的对象中,这些对象具有对象的“弱引用”。如果内存管理器内存不足,它可以收集这些对象。 (可以在http://javapapers.com/core-java/java-weak-reference/找到对此的一个很好的讨论。)你的代码必须准备好检查对象是否已被收获,但这是一种相当可管理的方式来处理你不知道你有多少内存。
此外,如果代码被抛出“内存不足”异常,则 也许在这种情况下,自愿抛弃其容器中最旧的条目,然后再次尝试操作。等等。在移动世界中,您没有“无限虚拟内存”的奢侈品。内存是真正的资源。