我需要将一些大型zip文件下载到我的应用程序中(每个大约25mb)但是它似乎很慢(5分钟+),当我们测试在iPad上下载的相同文件时,它会多次下载快点。我考虑过使用Volley,但似乎asynctask最适合大文件(从我读过的内容)。
有没有人对我如何能够更快地下载/写入这些文件有任何建议或想法?
我目前的实施情况如下所示:
@Override
protected String doInBackground(String... sUrl) {
InputStream input = null;
OutputStream output = null;
HttpURLConnection connection = null;
try {
URL url = new URL(sUrl[0]);
connection = (HttpURLConnection) url.openConnection();
connection.connect();
// expect HTTP 200 OK, so we don't mistakenly save error report
// instead of the file
if (connection.getResponseCode() != HttpURLConnection.HTTP_OK) {
return "Server returned HTTP " + connection.getResponseCode()
+ " " + connection.getResponseMessage();
}
// this will be useful to display download percentage
// might be -1: server did not report the length
int fileLength = connection.getContentLength();
// download the file
input = connection.getInputStream();
output = new FileOutputStream("/sdcard/file_name.extension");
byte data[] = new byte[1024];
long total = 0;
int count;
while ((count = input.read(data)) != -1) {
// allow canceling with back button
if (isCancelled()) {
input.close();
return null;
}
total += count;
// publishing the progress....
if (fileLength > 0) // only if total length is known
publishProgress((int) (total * 100 / fileLength));
output.write(data, 0, count);
}
} catch (Exception e) {
return e.toString();
} finally {
try {
if (output != null)
output.close();
if (input != null)
input.close();
} catch (IOException ignored) {
}
if (connection != null)
connection.disconnect();
}
return null;
}
答案 0 :(得分:1)
AsyncTask仅应用于相对较短的后台进程(即持续几秒钟的进程)。来自文档:
AsyncTask旨在成为Thread和Handler的辅助类 并不构成通用的线程框架。 AsyncTasks 理想情况下应该用于短期操作(几秒钟的时间) 大多数。)如果你需要保持线程长时间运行, 强烈建议您使用提供的各种API java.util.concurrent包,例如Executor,ThreadPoolExecutor和 FutureTask
对于长时间操作,您应该使用Service:
服务是表示一个的应用程序组件 应用程序希望执行更长时间运行的操作而不是 与用户交互或为其他人提供功能 要使用的应用程序。