InputStream-数据下载的时间点



我有4行代码来下载位图,

URL u = new URL(webaddress);
InputStream in = null;
in = u.openStream();
icon = BitmapFactory.decodeStream(in);

我计划更改最后一行,做一些类似于本教程的事情,在本教程中,我只将设置大小的图像加载到内存中,以减少内存使用。然而,我不希望这涉及到另一个服务器调用/下载,所以我很好奇上面四行中的哪一行实际上是从源下载数据的?

我将把最后一行代码改为上面提到的教程中的最后两个函数,这样就可以知道这是否意味着下载更多或更少的数据,(我试图只从一个可能是500万像素的图像中下载一个小图像)

如果这很简单/思考方式不对,我深表歉意。我对数据流没有太多经验。


编辑

im使用这两个函数来替换上面的最后一行代码:调用:

image = decodeSampledBitmapFromStram(in, 300,300);

图像质量不是优先事项,这是否意味着下载了更多的数据?

private static int calculateInSampleSize(BitmapFactory.Options options,
            int reqWidth, int reqHeight) {
        final int height = options.outHeight;
        final int width = options.outWidth;
        int inSampleSize = 1;
        if (height > reqHeight || width > reqWidth) {
            // Calculate ratios of height and width to requested height and
            // width
            final int heightRatio = Math.round((float) height
                    / (float) reqHeight);
            final int widthRatio = Math.round((float) width / (float) reqWidth);
            // Choose the smallest ratio as inSampleSize value, this will
            // guarantee
            // a final image with both dimensions larger than or equal to the
            // requested height and width.
            inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
        }
        return inSampleSize;
    }
    private Bitmap decodeSampledBitmapFromStream(InputStream in, int reqWidth, int reqHeight) {
        // First decode with inJustDecodeBounds=true to check dimensions
        final BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        Rect padding = new Rect();
        BitmapFactory.decodeStream(in, padding, options);
        // Calculate inSampleSize
        options.inSampleSize = calculateInSampleSize(options, reqWidth,
                reqHeight);
        // Decode bitmap with inSampleSize set
        options.inJustDecodeBounds = false;
        return BitmapFactory.decodeStream(in, padding, options);
    }

四行中的最后一行负责整个下载。CCD_ 1将继续从该流中提取数据,直到整个图像已被下载或中途发生错误。

至于带宽问题,在尝试之前,我会非常小心地了解解码器是如何对大图像进行下采样的。在将大图像缩小到更小的尺寸时,以高质量的方式做到这一点的唯一方法是通过对原始图像中的像素进行平均来进行下采样。如果解码器以这种方式进行下采样,那么就不会节省任何带宽,因为解码器仍然需要读取原始图像的每个像素,即使不是每个像素都存储在RAM中。您可以通过不读取原始图像中的每个像素来更快地向下采样,这将以最终图像质量为代价。沿着这些思路,我确实注意到了一个更喜欢"质量胜于速度"的选项:

http://developer.android.com/reference/android/graphics/BitmapFactory.Options.html#inPreferQualityOverSpeed

我有一种感觉,对于这个特定的选项,您可以通过读取更少的数据来获得更多的速度,但API声明这只适用于JPEG。不确定这是否有助于您的特定用例,但它可能值得研究。

以下文档将帮助您更好地了解流媒体http://docs.oracle.com/javase/tutorial/essential/io/streams.html.简而言之,一旦建立了与资源位置的连接,就会检索/读取一定大小的缓冲区(数据的一部分)。通常,这个过程一直持续到所有部分都被读取为止。

流媒体的主要优势是以一种分餐的方式运作。例如,假设您想要下载一个大小为500 MB的图像。流媒体允许分块下载,而不是一次性传输。这在错误处理、重试、峰值网络利用率等方面更好。

相关内容

  • 没有找到相关文章

最新更新