【问题标题】:Download multiple files下载多个文件
【发布时间】:2012-07-12 19:37:01
【问题描述】:

我正在使用此代码获取文件的链接:

private List<String> getFilesList(String path, String idcity){
    List<String> files = new ArrayList<String>();

    String readJSON = readJSON(path,idcity);

    try {
        JSONArray jsonArray = new JSONArray(readJSON);
        for (int i = 0; i < jsonArray.length(); i++) {
            JSONObject jsonObject = jsonArray.getJSONObject(i);
            files.add(jsonObject.getString("file"));
        }
    } catch (Exception e) {
        Log.e("getFilesList", "Error parsing data ", e);
    }

    return files;
}

现在我想将所有这些文件下载到 SDCard。

我认为这可以使用 AsyncTask 来实现(并显示一个 ProgressDialog,其中包含有多少文件要下载的信息)。

我使用的是 Android API 4,所以无法使用 DownloadManager。

假设链接在List&lt;String&gt; 中,你们能给我一些代码吗?

提前致谢!

【问题讨论】:

    标签: android


    【解决方案1】:

    在循环中使用此函数,循环遍历您的 URL 列表

    已编辑:使用较早的代码,如果您下载的文件大于 4MB,则会出现 OutOfMemoryError。使用这个,效果很好!

    来源:SO Question

    public boolean downloadFromUrl(String url, String outputFileName) {
    
            File dir = new File(Environment.getExternalStorageDirectory() + "/"
                    + getString(R.string.directory_appBase) + "/");
            if (!dir.exists()) {
                dir.mkdirs();
            }
            try {
                File file = new File(dir, outputFileName);
                URL downloadUrl = new URL(url);
                URLConnection ucon = downloadUrl.openConnection();
                ucon.connect();
    
                InputStream is = ucon.getInputStream();
    
                FileOutputStream fos = new FileOutputStream(file);  
    
                byte data[] = new byte[1024];
    
                int current = 0;
                while ((current = is.read(data)) != -1) {
                    fos.write(data, 0, current);
                }        
                is.close();
                fos.flush();
                fos.close();
                isFileDownloaded=true;
            } catch (IOException e) {
                e.printStackTrace();
                isFileDownloaded = false;
                System.out.println(outputFileName + " not downloaded");
    
            }
            if (isFileDownloaded)
                System.out.println(outputFileName + " downloaded");
            return isFileDownloaded;
    
        }
    

    【讨论】:

    • 它适用于小文件,但是当它尝试下载大小为 4MB+ 的文件时,它给了我一个 OutOfMemory 错误...任何解决方案?
    • 你用的是模拟器还是真机?
    • 模拟器。我使用在模拟器上完美运行的代码编辑了您的答案。非常感谢您的回答,我的问题已经解决了! :)
    【解决方案2】:

    只需获取DownloadManager 源并将其添加到您的项目中。它的依赖项很少。

    http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.3_r1/android/app/DownloadManager.java#DownloadManager

    DownloadManager 做了很多事情,如果你自己去实现会很痛苦。当然,它调用归结为执行 HTTP GET,但魔鬼在细节中。

    【讨论】:

    • 如您所见,DownloadManager 需要 API 级别 9,而我正在使用 API 级别 4,因此无法选择 DownloadManager。
    • 不,你误会了。不要从SDK中使用它,获取源代码,并将源文件添加到您的项目中。就像说的那样,它似乎很少依赖于 API 级别 4 中不存在的 android SDK。
    • 您能否提供一些代码,使用该源代码来循环文件并下载每个文件并将其包装在异步任务中(因为我想放置一个进度对话框)...
    • 我链接到上面的代码。有人花了很多时间来写它并把它做好。你应该使用它。
    猜你喜欢
    • 1970-01-01
    • 2013-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-09
    相关资源
    最近更新 更多