Android 在 BitmapFactory.decodeStream() 中重用流

标签 android memory-management bitmap stream

我们需要对从 InputStream 接收到的图像进行下采样。它是从某个 URL 接收到的图像,它可以非常小或非常大。为了将此图像放入内存,我们必须对其进行下采样。首先,我们借助 inJustDecodeBounds 检索图像大小并计算必要的样本。然后,我们通过在 BitmapFactory.Options.inSampleSize 中指定此示例来创建下采样位图。这个两步解码需要调用两次 decodeStream() 并且工作正常。

这对 SD 卡中的文件非常有效。但在我们的例子中,输入流不能被重置,所以我们不能调用 decodeStream() 两次。克隆输入流也不是一种选择,因为它的大小很大。或者,我们可以对同一个 URL 创建 2 个 HTTP 请求:首先获取图像大小,然后通过下采样解码实际图像,但这种解决方案似乎相当丑陋。

我们可以重用无法重置的流吗?或者请针对此问题提出一些已知的解决方法。

最佳答案

如果您不想重用流,显然必须将其保存到 RAM 或 SD 卡中,因为网络 InputStream(假设它没有缓冲)不会保留下载的数据。

因此,如前所述,解决此问题的方法是将图像直接保存到 SD 卡(可能在某些 temp 目录中),如果图像真的很大的话。

关于Android 在 BitmapFactory.decodeStream() 中重用流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13418081/

相关文章:

android - 空对象引用上的 Bitmap.getWidth()'

java - Android 上的两个级别的 Activity 。无缝过渡

android - 为什么 HandlerThread 需要一个名字?

实现简单内存池的 C 库

android - 在 Android 中即时编辑位图

Android ImageView 使应用变慢

android - 如何在首选项中注销内容观察者

javascript - 在android webview中使用javascript

java.lang.OutOfMemoryError Spark DAG 具有更多阶段

c++ - 如何在 C++ 中调试双重删除?