异步文件下载android

时间:2012-03-27 07:26:34

标签: java android

我开始创建文件下载器类。这就是我所拥有的:

public class Downloader {

    //download url
    URL url;

    public Downloader(URL downloadURL){
        url = downloadURL;
    }


      public void toFile(File fName) {
            try {

                HttpURLConnection urlConnection = (HttpURLConnection) url
                        .openConnection();

                urlConnection.setRequestMethod("GET");
                urlConnection.setDoOutput(true);

                urlConnection.connect();

                FileOutputStream fileOutput = new FileOutputStream(fName);

                InputStream inputStream = urlConnection.getInputStream();

                byte[] buffer = new byte[1024];
                int bufferLength = 0;

                while ((bufferLength = inputStream.read(buffer)) > 0) {
                    fileOutput.write(buffer, 0, bufferLength);

                }

                fileOutput.close();

            } catch (Exception e) {
                e.printStackTrace();
            }
        }




}

我需要在新线程中调用此下载程序。也许有人可以给我提示为什么我需要为此调用新线程或asyc任务。

public void downloadFile(String urlToDownload,String path) throws MalformedURLException{




        new Thread(new Runnable() {
            public void run() {
                new Downloader(new URL(urlToDownload)).toFile(new File(path));

                 }


          }).start();
}

因此,当我想下载我的文件时,它会异步下载。

我真的不想那样。  我想创建下载器,我可以选择是否要同步或异步下载文件。

但首先,我想知道何时下载文件。我怎么知道这个?

也许有人这样做了,可以帮助我。 我需要知道何时下载文件。

感谢。

5 个答案:

答案 0 :(得分:4)

  1. 您无法在主线程上下载任何内容,您将在版本<版本中获得Application Not Responding对话框3.0以及3.0及更高版本只是例外。

  2. 您目前的做法几乎是正确的。

  3. 如果您要发布下载进度并通知用户界面已完成下载,您可以使用AsyncTaskHandlerIntent通知任何应用程序组件已完成下载

答案 1 :(得分:2)

  1. 在调用start()后,在线程启动时启动。为方便起见,通常使用类似matemink解决方案的Asyntask:

    +方法doInBackground()将在工作线程中运行

    +方法onPostExecute(0将运行以更新UI线程

  2. 关注您:

      

    我需要在新线程中调用此下载程序。也许有人可以给   我暗示为什么我需要为此

    调用新线程或asyc任务
  3. <强>答案: 您需要在单独的线程或Asyntask中下载以避免ANR对话̣(如果您需要下载大文件或者您的网络连接速度很慢,它可能会导致主UI线程中出现ANR对话框),这就是为什么您需要在工作者中放置高工作负载的工具线程而不是主UI线程:

    参考: http://developer.android.com/guide/practices/design/responsiveness.html

答案 2 :(得分:0)

使用Handler了解您的文件何时下载。

答案 3 :(得分:0)

仍然使用AsyncTask,并使用onProgressUpdate方法。

 private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
     protected Long doInBackground(URL... urls) {
        int count = urls.length;
         long totalSize = 0;
     for (int i = 0; i < count; i++) {
         totalSize += Downloader.downloadFile(urls[i]);
         publishProgress((int) ((i / (float) count) * 100));
     }
     return totalSize;
 }

 protected void onProgressUpdate(Integer... progress) {
     setProgressPercent(progress[0]);
 }

 protected void onPostExecute(Long result) {
     showDialog("Downloaded " + result + " bytes");
 }

}

答案 4 :(得分:0)

是的,您无法在主线程中执行网络操作。 您可以查看此存储库以下载文件。 AndroidFileDownloaderModule