Android 从url中加载高图像,防止整个图像加载到ram中

Android 从url中加载高图像,防止整个图像加载到ram中,android,bitmap,streaming,android-image,Android,Bitmap,Streaming,Android Image,我正在寻找一个库或一些关于我如何可以加载从磁盘或直接到磁盘的url部分图像,然后再在ram部分的想法。因此,我认为有两种方法可以做到这一点,即通过直接使用ram从url读写整个图像到磁盘上(仅用于缓冲区),然后当图像在磁盘上时,如何仅创建图像部分的位图,这样我就不会全部加载图像并将其放入列表视图中 问题是我处理的是非常长的图像(10K+像素长,宽度为4-600),如果在一个位图中加载,它们会占用大量内存。我不能像谷歌android教程中处理大型位图部分那样缩小它们,因为这样会导致宽度太小而无法处

我正在寻找一个库或一些关于我如何可以加载从磁盘或直接到磁盘的url部分图像,然后再在ram部分的想法。因此,我认为有两种方法可以做到这一点,即通过直接使用ram从url读写整个图像到磁盘上(仅用于缓冲区),然后当图像在磁盘上时,如何仅创建图像部分的位图,这样我就不会全部加载图像并将其放入
列表视图中

问题是我处理的是非常长的图像(10K+像素长,宽度为4-600),如果在一个位图中加载,它们会占用大量内存。我不能像谷歌android教程中处理大型位图部分那样缩小它们,因为这样会导致宽度太小而无法处理。因此,如果我可以在磁盘上生成小的位图片段,我可以通过将它们加载到
列表视图中来使用它们,从而防止将图像作为一个整体加载到ram中


现在,我正在将长图像从位图中分割成碎片,我意识到这并没有真正实现我想要做的事情,因为整个图像被加载到内存中的位图中,然后被分解,然后是GC(所以我无论如何都会耗尽全部内存)。我正在一款新的顶级android手机上测试,该应用程序运行良好,但堆大小达到80mb以上,较大的图像暂时放在ram中,因为它会破坏位图,这对于堆限制较低的设备来说将是一个问题。如果您使用Java,您可以使用InputStreamReader和OutputStreamWriter。方法read()接受缓冲区作为参数之一,其长度可以是任何合适的。当然,您可以为正在写入的每个缓冲区创建一个新文件

这就是你要找的吗

编辑
其实不是。你看到了吗?

你可以尝试使用这个类,2.3版的支持

  • 如果您可以控制从中获取数据的服务器,请在响应中插入另一个字段,以便它返回缩略图/更小的图像。然后,服务器可以为您生成所需的缩略图,而无需您操心

  • 在大多数情况下,动态解码位图可能很昂贵。如果无法在服务器上更改任何内容,下载并保存图像,保存后,生成相应的缩略图并保存它们。在列表中,使用缩略图。此外,请保存有关缓存了哪些图像以及已经缓存了哪些缩略图的信息。这看起来可能需要做很多工作,但根据用例的不同,这可能是处理大型图像的更好方法

  • 裁员问题?
    嗯,你可以根据图像的原始大小来生成缩略图。对于较长的(垂直长的图像),您可以按照@Binh Tran的建议使用BitmpapRegionDecoder()。

    尝试对图像进行编码,使其尺寸变小

    我怎么知道每个部分有多少图像,我需要有图像的宽度和任何高度的碎片,以便我可以在ListView中设置它们抱歉,我有点忙,但我无法找到可压缩的android版本到您的代码中。比如说png,我刚才看了你提到的问题,它没有帮助,因为使用缩小尺寸的方法会降低高度和宽度,而在长图像上这样做会导致宽度非常小。对于长图像,我说的是10k+像素。这不需要我将图像加载到位图到ram中吗?这就是我试图避免的。谢谢