在没有第三方库的情况下下载远程图像的最佳方式?
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 的最佳方式