OutOfMemoryError:无法分配3686412字节分配482112个空闲字节和470KB直到OOM?

时间:2016-06-26 16:38:08

标签: android sql sqlite

我想制作图像备份,因为我使用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();
                  }

2 个答案:

答案 0 :(得分:1)

当图像非常大时会发生这种情况。你可以用Jpg中的油漆保存图像,并以这种方式减小尺寸。尝试使用不同尺寸,直到其中一个工作。

答案 1 :(得分:0)

您没有向我们展示围绕此代码段的代码,即“如何管理检索到的数据”。例如,您可能会发现不可能(!)同时在内存中保存“10或12个图像”... 和-d-d 每个设备都会有所不同! (作为开发人员,您自然会购买“装备”设备,而您的实际客户在杂货店购买了她的手机。)您将不得不设计某种方案,仅将最近检索到的图像存储在内存中

一种可能的策略是将这些图像存储在对象中保存的对象中,这些对象具有对象的“弱引用”。如果内存管理器内存不足,它可以收集这些对象。 (可以在http://javapapers.com/core-java/java-weak-reference/找到对此的一个很好的讨论。)你的代码必须准备好检查对象是否已被收获,但这是一种相当可管理的方式来处理你不知道你有多少内存。

此外,如果代码被抛出“内存不足”异常,则 也许在这种情况下,自愿抛弃其容器中最旧的条目,然后再次尝试操作。等等。在移动世界中,您没有“无限虚拟内存”的奢侈品。内存是真正的资源。