Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/210.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 测量一个可拉丝的大小(内存)_Android_Jpeg_Out Of Memory - Fatal编程技术网

Android 测量一个可拉丝的大小(内存)

Android 测量一个可拉丝的大小(内存),android,jpeg,out-of-memory,Android,Jpeg,Out Of Memory,我最初的问题是,我下载了一个1.3MB jpeg文件,并将其设置为图像。这导致内存不足异常。显然,现在服务器在我下载之前调整了照片的大小。然而,我仍然得到了期望。测量我下载的文件大小的最简单方法是什么 编辑我还应该提到,这在模拟器上运行良好,但在G1上运行时会失败 public Drawable getImage() throws IOException, MalformedURLException { InputStream is = (InputStream) new

我最初的问题是,我下载了一个1.3MB jpeg文件,并将其设置为图像。这导致内存不足异常。显然,现在服务器在我下载之前调整了照片的大小。然而,我仍然得到了期望。测量我下载的文件大小的最简单方法是什么

编辑我还应该提到,这在模拟器上运行良好,但在G1上运行时会失败

    public Drawable getImage() throws IOException, MalformedURLException {
        InputStream is = (InputStream) new java.net.URL(url).getContent();


        return Drawable.createFromStream(is, "name");


}

如果通过流执行此操作,则每个流子级(例如InputStream)都有一个读取方法,该方法返回读取字节数。只需计算这些字节,就可以得到图像的大小。下面是一个小代码示例:

while((count=is.read(data))!=-1){
输出。写入(数据,0,计数);
}


祝你好运

可能发生OOM异常,因为您没有回收正在创建的位图对象。渲染图像时(我假设在ImageView中),您可能希望执行以下操作:

  ImageView iv;

  // before you update the imageview with the image from the server
  if(iv.getDrawable() != null) ((BitmapDrawable)iv.getDrawable()).getBitmap().recycle();

重要的是要下载/加载的图像的尺寸。内存使用量大约为宽*高*2字节(如果图像以32位加载,则为*4字节)。BitmapFactory提供了一种在不加载整个图像的情况下读取图像尺寸的方法。在加载图像之前,您可以使用此选项查看图像在内存中的大小。

您是指渲染图像后的磁盘大小还是消耗的内存?我想找出导致OOM异常的原因,因此我猜是什么原因,谢谢您,但我不知道如何将其合并到代码中。你能帮我吗?我已经在@EgorInitialize一个字节数组“data”上面添加了me代码,并使用此代码从您的InputStream读取传入的字节。然后从这个字节数组创建一个可绘制的。希望我解释得对。我每次活动只得到一张图片。因此,如果我在得到图像之前进行回收,我就不会回收任何东西。我这样想对吗?嗯,小心点。每个活动1个图像并不意味着您没有创建多个位图。根据您的代码路径,您可能会从文件中重新膨胀图像,并设置ImageView的可绘制图像。如果您正在这样做,那么您仍然需要执行类似的操作,否则您将耗尽内存。我建议在你的
drawImage()
函数中加入一个
android.util.Log
语句:如果它被多次调用,那么你肯定需要这样的东西。我原以为我在安卓上取得了一些进展,但现在我觉得自己有点不知所措。我不调用drawImage()方法。我使用上述方法返回的drawable创建了一个新的ImageView。我完全迷路了,所以我非常感谢您的帮助OOM问题的关键部分是,如果该函数被多次调用,您将很快耗尽内存,因为它正在创建多个可绘图项。因此,第一步是验证调用了多少次,以及是否要在创建新内存之前使用
recycle()
函数来释放所使用的内存