在没有第三方库的情况下下载远程图像的最佳方式?

Posted

技术标签:

【中文标题】在没有第三方库的情况下下载远程图像的最佳方式?【英文标题】:Best way to download remote images without third party libraries? 【发布时间】:2015-04-22 02:24:22 【问题描述】:

欢迎

我需要从服务器同步(一次一个)下载许多小的远程图像(50kb 到 100kb 之间),并将它们以 PNG 格式存储在设备中。我需要在没有第三方库的情况下实现这一点,我正在使用这段代码,但它太慢了:

        URL javaUrl = new URL(URLParser.parse(this.url));
        URLConnection connection = javaUrl.openConnection();

        InputStream input = new BufferedInputStream(javaUrl.openStream());
        ByteArrayOutputStream output = new ByteArrayOutputStream();

        byte data[] = new byte[1024];
        long total = 0;
        int count;
        while ((count = input.read(data)) != -1) 
            total += count;
            output.write(data, 0, count);
        

        // conversion to bitmap
        InputStream in = new ByteArrayInputStream(output.toByteArray());
        Bitmap original = BitmapFactory.decodeStream(in);

        // storing bitmap as PNG file
        FileOutputStream out = new FileOutputStream(filename);
        original.compress(Bitmap.CompressFormat.PNG, 90, out);

        output.flush();
        output.close();
        input.close();
        in.close();
        original.recycle(); 

问题是下载速度很慢。在设备中使用非常快的 WIFI 互联网(13MB,下载速度为 1.4mbytes/s),在设备中下载图像需要 3-4 秒,但在我的 PC 中使用谷歌浏览器下载图像只需 100-200ms例如。

我的下载算法有问题吗?可以改进吗?

谢谢

【问题讨论】:

将它们添加到zip文件中,您可以下载并从代码中提取! 1.尝试在 InputStream 之上使用 BufferedInputStream。 2.如果以后不需要读取png数据,直接为Bitmap.decode手工BufferedInputStream。 通过一个简单的谷歌查询,我可以找到关于这个主题的三个不同的问题,你确定它们都没有解决你的问题吗? First、Second 和 Third 我不认为“欢迎”意味着你认为它的意思。 Harism,为什么我应该使用缓冲而不是普通输入?我测试了它,似乎速度相等 【参考方案1】:

中间有一个完全不必要的字节数组。 BitmapFactory.decodeStream() 接受 InputStream 并从 URL.openStream() 获得 InputStream

它可能不会为您提供所需的速度提升,但它至少会摆脱代码中完全无用的步骤。

【讨论】:

好吧,电话和 Wifi 与 PC 和物理电缆完全不同。 如果我使用你的方式,我应该关闭并刷新任何输入和输出吗?怎么样? 是的,您应该关闭输入和输出。以标准方式。 怎么样?如果我使用你的方式,我看不到该怎么做,URL 没有关闭方法 你应该重新学习 Java 基础知识,好像你错过了很多东西。 InputStream in = javaUrl.openStream(); BitmapFactory.decodeStream(in);。这样你就有了对输入流的引用并且你可以关闭它,但你不会在两者之间做任何不必要的事情(比如添加无用的 ByteArrayStreams)。

以上是关于在没有第三方库的情况下下载远程图像的最佳方式?的主要内容,如果未能解决你的问题,请参考以下文章

Flutter 如何在没有任何第三方库的情况下从 url 下载文件

如何在没有第三方库的情况下创建自定义幻灯片菜单。?

Firebase Cloud Messaging 令牌在没有第三方库的情况下本机反应

Android AudioRecord - 在没有库的情况下获得 FFT 的最佳方式

如何在没有任何第三方库的情况下使用 UIKit 在 iOS 应用程序中使用 Swift 5 中的 GIF?

在没有库的情况下在 Java 中读取 PKCS#1 或 SPKI 公钥