Android - 快速下载中型文件的最佳实践

时间:2015-07-17 21:33:46

标签: android download android-asynctask

我需要将一些大型zip文件下载到我的应用程序中(每个大约25mb)但是它似乎很慢(5分钟+),当我们测试在iPad上下载的相同文件时,它会多次下载快点。我考虑过使用Volley,但似乎asynctask最适合大文件(从我读过的内容)。

有没有人对我如何能够更快地下载/写入这些文件有任何建议或想法?

我目前的实施情况如下所示:

我的AsyncTaskExample:

@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;
 }

1 个答案:

答案 0 :(得分:1)

AsyncTask仅应用于相对较短的后台进程(即持续几秒钟的进程)。来自文档:

  

AsyncTask旨在成为Thread和Handler的辅助类   并不构成通用的线程框架。 AsyncTasks   理想情况下应该用于短期操作(几秒钟的时间)   大多数。)如果你需要保持线程长时间运行,   强烈建议您使用提供的各种API   java.util.concurrent包,例如ExecutorThreadPoolExecutor和   FutureTask

对于长时间操作,您应该使用Service

  

服务是表示一个的应用程序组件   应用程序希望执行更长时间运行的操作而不是   与用户交互或为其他人提供功能   要使用的应用程序。