1

アプリでファイルをダウンロードしようとしていますが、ダウンロード時間が一貫して長すぎます。通常の時間にダウンロードするだけの場合もありますが、タイムアウトエラーのために失敗するまで、30秒以上スタックすることもあります。

なぜでしょうか?

    private void Download(String url, String destFileName) throws IOException{
        //TODO remove that
//      File file = new File(destFileName);
//      if(file.exists())
//          return;

        if(BuildConfig.DEBUG)
            Log.d("DownloadFile", "Downloading url: " + url + ", dest: " + destFileName);

        HttpGet httppost = null;
        AndroidHttpClient client = AndroidHttpClient.newInstance("TvinciAndroid");
        FileOutputStream fos = new FileOutputStream(destFileName);

        try {

            httppost = new HttpGet(url);
            HttpResponse res = client.execute(httppost);

            if (res.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {
                Header[] headers = res.getHeaders("Location");
                if(headers != null && headers.length != 0) {
                    url = headers[headers.length - 1].getValue();
                    Download(url, destFileName);
                }
            }

            HttpEntity responseEntity = res.getEntity();

            if (responseEntity != null && responseEntity.getContentLength() > 0) {
                InputStream is = AndroidHttpClient.getUngzippedContent(responseEntity);
                BufferedReader reader = new BufferedReader(new InputStreamReader(is,Charset.forName("UTF-8")));
                StringBuilder bld = new StringBuilder();
                String line;
                while ((line = reader.readLine()) != null) {
                    line += "\n";
                    fos.write(line.getBytes());
                    bld.append(line);
                }
                reader.close();
                if(BuildConfig.DEBUG)
                    Log.d("file content", bld.toString());
                bld = null;
            }

        } 
        catch(IOException ex){
            throw ex;
        }
        finally {
            client.close();
            fos.close();
        }
    }

どんな助けでも大歓迎です

4

1 に答える 1

-1

バッファを 8192 に指定してみてください。

//input stream to read file - with 8k buffer
InputStream input = new BufferedInputStream(url.openStream(), 8192);

URL経由でファイルをダウンロードできるサンプルの作業コードがここにあります。実装とは異なりますが、これは役立つかもしれません。

try {

        URL url = new URL(f_url[0]);
        URLConnection conection = url.openConnection();
        // getting file length
        int lengthOfFile = conection.getContentLength();

        // input stream to read file - with 8k buffer
        InputStream input = new BufferedInputStream(url.openStream(), 8192);

        // Output stream to write file
        OutputStream output = new FileOutputStream(filePath);

        byte data[] = new byte[1024];
        long total = 0;

        pDialog.setMax(lengthOfFile);
        NOTIFICATION_ID = 1+lengthOfFile;

        while ((count = input.read(data)) != -1) {

            total += count;
            // publishing the progress....
            // After this onProgressUpdate will be called
            //publishProgress(""+(int)((total*100)/lenghtOfFile));
            publishProgress(""+(int)(total));
            notifBuilder.setProgress(lengthOfFile, (int)(total), false)
                        .setContentText("Download in progress... "+total+"/"+lengthOfFile);
            nm.notify(NOTIFICATION_ID, notifBuilder.build());

            // writing data to file
            output.write(data, 0, count);

        }

        // flushing output
        output.flush();

        // closing streams
        output.close();
        input.close();

    }  catch (IOException e) {
        e.printStackTrace();
        Log.e("Error: ", e.getMessage());
        return e.getMessage()+" download failed!";
    }

これが役立つことを願っています。

于 2013-08-20T07:43:30.633 に答える