【问题标题】:download multiple files keeps stopping android下载多个文件不断停止android
【发布时间】:2013-07-05 14:54:49
【问题描述】:

尝试使用以下代码从服务器下载大约 38 个视频文件,但由于某种原因,它在下载过程中不断停止在不同的点,我主要得到一个

java.net.SocketException: Connection timed out

我想知道如何以更少的错误执行此操作

下面是我的代码

private class DownloadFile extends AsyncTask<String, Integer, String> {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            mProgressDialog.show();
        }

        @Override
        protected void onProgressUpdate(Integer... progress) {
            super.onProgressUpdate(progress);
            mProgressDialog.setProgress(progress[0]);
            mProgressDialog.setMessage("Downloading "+(i+1)+" of "+downloadURL.length);
        }

        @Override
        protected String doInBackground(String... sUrl) {
            try {

                for(int i = 0; i < sUrl.length; i++){

                    URL url = new URL("http://myvideo.info/videos/"+sUrl[i]);
                    URLConnection connection = null;
                    try {

                        connection = url.openConnection();
                        connection.setConnectTimeout(15000);
                        connection.setReadTimeout(15000);
                    } catch (java.net.SocketTimeoutException e) {
                        e.printStackTrace();
                    }catch (Exception e) {
                        e.printStackTrace();
                    }
                    connection.connect();
                    // this will be useful so that you can show a typical 0-100% progress bar
                    int fileLength = connection.getContentLength();

                    // download the file
                    InputStream input = new BufferedInputStream(url.openStream());
                    OutputStream output = new FileOutputStream("/sdcard/"+file_rename[i]);

                    byte data[] = new byte[1024];
                    long total = 0;
                    int count;
                    while ((count = input.read(data)) != -1) {
                        total += count;
                        // publishing the progress....
                        publishProgress((int) (total * 100 / fileLength));
                        output.write(data, 0, count);
                    }

                    output.flush();
                    output.close();
                    input.close();
                }

            } catch (Exception e) {
                Log.e("PP", "PP", e);
            }
            return null;
        }

        protected void onPostExecute(String jsonResult) {
            mProgressDialog.dismiss();
        }
    }

【问题讨论】:

  • 如果无法连接互联网,就会发生这种情况。
  • 尝试增加超时值,互联网连接是这里的问题..
  • 您的超时设置为 15000... 是秒还是毫秒?
  • 15 秒,我增加了它,但并没有太大的不同。我现在就试试github代码

标签: java android httpurlconnection urlconnection androidhttpclient


【解决方案1】:

您确定服务器会在 15 秒内做出响应吗?(这是我看到的您设置的超时时间)。如果文件很大,您应该单独下载它们,看看Downloader manager,您可以使用它轻松下载大文件。

【讨论】:

  • 谢谢 这似乎仅适用于 API 9 及更高版本
  • 如果您确定服务器正常工作,您可以将超时设置为0(这意味着没有超时)
  • 推荐的方法是查看设备的api版本,如果是9或以上你应该下载管理器,如果是8,使用手动下载。
  • 我可以在下载文件时使用下载管理器重命名文件吗?它是否在 url 上使用数组?
  • 在 google 上搜索一下,要重命名文件,请查看 .setDestinationInExternalFilesDir()(这是应要求提供的),据我所知,它不需要一组 url,但是你可以发出多个下载请求。
【解决方案2】:

您使用的是什么下载管理器? 我建议将您的超时更改为最大值。就个人而言,您的代码似乎很好。我认为这将是您的下载管理器和超时。希望这会有所帮助。

【讨论】:

  • 可能的最大超时时间是多少,我将其增加到 2 分钟,似乎效果更好,但我想在 Max。
  • 我没有使用任何下载管理器,是否有适用于 API 级别 8 的下载管理器?
  • 我找不到 API 的 DM,但我确实找到了一个已针对 API 的 DM 回答的问题。 [quote] 如何 可以 i 使用 DownloadManager in API levels lower than 9? 你不能。您需要自己下载文件,使用 HttpUrlConnection 或 HttpClient[/quote
猜你喜欢
  • 2019-08-20
  • 1970-01-01
  • 2014-05-27
  • 1970-01-01
  • 2014-01-22
  • 1970-01-01
  • 2016-12-10
  • 2016-06-08
  • 1970-01-01
相关资源
最近更新 更多