【问题标题】:How to show image preview while downloading it on Android?如何在 Android 上下载时显示图像预览?
【发布时间】:2013-02-23 15:43:31
【问题描述】:

我想编写一个显示来自 Cherokee 网络服务器的图像的应用程序。我确实使用以下代码下载图像:

@Override
protected Bitmap doInBackground(URL... params) { 
    URL urlToDownload = params[0];
    String downloadFileName = urlToDownload.getFile();
    downloadFile = new File(applicationContext.getCacheDir(), downloadFileName);
    new File(downloadFile.getParent()).mkdirs(); // create all necessary folders

    // download the file if it is not already cached
    if (!downloadFile.exists()) {
        try {
            URLConnection cn = urlToDownload.openConnection();   
            cn.connect();
            cn.setReadTimeout(5000);
            cn.setConnectTimeout(5000);
            InputStream stream = cn.getInputStream();

            FileOutputStream out = new FileOutputStream(downloadFile);   
            byte buf[] = new byte[16384];
            int numread = 0;
            do {
                numread = stream.read(buf);   
                if (numread <= 0) break;   
                out.write(buf, 0, numread);
            } while (numread > 0);
            out.close();
        } catch (FileNotFoundException e) {
            MLog.e(e);
        } catch (IOException e) {
            MLog.e(e);
        } catch (Exception e) {
            MLog.e(e);
        }
    }

    if (downloadFile.exists()) {
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inSampleSize = 16;
        return BitmapFactory.decodeFile(downloadFile.getAbsolutePath(), options);   
    } else {
        return null;
    }
}

这可行,但由于我需要下载的图像非常大(数兆字节),用户需要一些时间才能看到任何内容。

我想在加载完整图像时显示图像的低分辨率预览(就像任何网络浏览器一样)。我怎样才能做到这一点? BitmapFactory 似乎只接受完全加载的文件或在解码之前也完全下载的流。

服务器上只有高分辨率图像。我只想在下载时显示我已经下载的图像的所有内容,以便在完全下载之前显示(部分)图片。这样一来,用户可以在看到这不是他要查找的图片时立即中止下载。

【问题讨论】:

    标签: android image preview download bitmapfactory


    【解决方案1】:

    最简单的方法就是下载两张图片。一个很小的(比如说几个字节)然后放大它(它看起来很糟糕,但会给出进度的概念),同时在后台加载更大的图像。很可能较小的会首先返回,您将能够使其看起来好像从低分辨率变为高分辨率。

    【讨论】:

    • 很遗憾我无法对服务器进行任何更改。
    • Android 确实支持渐进式 jpeg,但不确定您是否可以让解码器解码部分。最可能的方法是将原始图像保存到文件中,而在成功 write() 之后,您尝试执行并异步读取。这样,如果它是渐进式 JPEG,您可能会得到部分解码。但是,由于您无法更改服务器组件,因此您正在抓取的任何站点都可能不提供渐进式 jpeg。显示填充的进度指示器可能更好
    【解决方案2】:

    2 AsyncTask 怎么样? 第一个下载小或低分辨率图像并将其显示在 ImageView 上,然后第一个 AsyncTask 调用第二个 AsyncTask 下载全分辨率图像。

    【讨论】:

    • 不幸的是,我无法对服务器进行任何更改。此服务器上没有小尺寸图像。我只想显示下载过程中已经下载的图片的所有内容。就像任何网络浏览器在您打开大图片时所做的那样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-25
    • 1970-01-01
    • 2013-07-27
    • 1970-01-01
    • 2017-10-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多