使用 OkHttp 下载大量图片到 SD 卡
Use OkHttp to download lots of images to sd card
所以我的应用程序的一部分使用 IntentService 将大量 (~1600) 图像下载到 SdCard。我以前使用 Glide,但现在想切换到 OkHttp,因为它似乎更快,耗电量更少。这是我当前的代码:
for (int i = 1; i < 1600; i++) {
try {
Request request = new Request.Builder()
.url(imageUrls[i])
.build();
Response response = client.newCall(request).execute();
File testDirectory = new File(Environment.getExternalStorageDirectory()
+ "/downloadTest");
if (!testDirectory.exists())
testDirectory.mkdirs();
OutputStream outputStream = new FileOutputStream(new File(testDirectory,
"testImage" + i + ".png"));
InputStream inputStream = response.body().byteStream();
byte[] buffer = new byte[1024];
int read;
while ((read = inputStream.read(buffer, 0, buffer.length)) >= 0)
outputStream.write(buffer, 0, read);
outputStream.flush();
outputStream.close();
inputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
有什么方法可以优化此代码以加快下载速度吗?
最简单的方法是:
InputStream inputStream = response.body().byteStream();
Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
并将位图保存为 jpg:
File file = new File (myDir, fname);
if (file.exists ()) file.delete ();
try {
FileOutputStream out = new FileOutputStream(file);
finalBitmap.compress(Bitmap.CompressFormat.JPEG, 90, out);
out.flush();
out.close();
} catch (Exception e) {
e.printStackTrace();
}
您可以使用 Okio 而不是 InputStream
/OutputStream
来保存一些副本。像这样:
BufferedSink sink = Okio.buffer(Okio.sink(new File(testDirectory, "testImage" + i + ".png")));
sink.writeAll(response.body().source());
sink.close();
response.body().close();
请参阅 this post 以了解为何速度更快的解释。
所以我的应用程序的一部分使用 IntentService 将大量 (~1600) 图像下载到 SdCard。我以前使用 Glide,但现在想切换到 OkHttp,因为它似乎更快,耗电量更少。这是我当前的代码:
for (int i = 1; i < 1600; i++) {
try {
Request request = new Request.Builder()
.url(imageUrls[i])
.build();
Response response = client.newCall(request).execute();
File testDirectory = new File(Environment.getExternalStorageDirectory()
+ "/downloadTest");
if (!testDirectory.exists())
testDirectory.mkdirs();
OutputStream outputStream = new FileOutputStream(new File(testDirectory,
"testImage" + i + ".png"));
InputStream inputStream = response.body().byteStream();
byte[] buffer = new byte[1024];
int read;
while ((read = inputStream.read(buffer, 0, buffer.length)) >= 0)
outputStream.write(buffer, 0, read);
outputStream.flush();
outputStream.close();
inputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
有什么方法可以优化此代码以加快下载速度吗?
最简单的方法是:
InputStream inputStream = response.body().byteStream();
Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
并将位图保存为 jpg:
File file = new File (myDir, fname);
if (file.exists ()) file.delete ();
try {
FileOutputStream out = new FileOutputStream(file);
finalBitmap.compress(Bitmap.CompressFormat.JPEG, 90, out);
out.flush();
out.close();
} catch (Exception e) {
e.printStackTrace();
}
您可以使用 Okio 而不是 InputStream
/OutputStream
来保存一些副本。像这样:
BufferedSink sink = Okio.buffer(Okio.sink(new File(testDirectory, "testImage" + i + ".png")));
sink.writeAll(response.body().source());
sink.close();
response.body().close();
请参阅 this post 以了解为何速度更快的解释。