0

これは少し抽象的な質問ですが、誰かが私のために持っているかもしれない簡単な提案や答えがあるかどうか疑問に思っていました.

いくつかのテキスト ファイルをダウンロードするためのループを含む AsyncTask があります。ファイルは小さく、約 12 個あります。現在、ダウンロードに最大 10 秒かかっていますが、思ったよりも長いです。ダウンロードを高速化するためにできることはありますか、またはそれらを 1 つではなく同時にダウンロードする方法はありますか一つ?

非同期とダウンロード用のコードをここに示します。

@Override
protected Long doInBackground(URL... params) {



    try { 
        // Loop to download 
        distance dis = new distance();
        URL[] urlArray = dis.urlArray();
        URL[] urlExtra = dis.urlArrayExtra();
        String [] stationName = dis.getStationName();
        String [] stationNameExtra = dis.getStationNameExtra();
        for  (int i = 0; i < urlArray.length; i++) {

        String fileName = stationName[i];

        File file = new File(sdCard.getAbsolutePath() +
                "/Download/" + fileName);
        URL url = urlArray[i];
        /* Open a connection to that URL. */ 
        URLConnection ucon = url.openConnection();

        /*
         * Define InputStreams to read from the URLConnection. 
         */
        InputStream is = ucon.getInputStream(); 
        BufferedInputStream bis = new BufferedInputStream(is);

        /*
         * Read bytes to the Buffer until there is nothing more to read(-1).
         */
        ByteArrayBuffer baf = new ByteArrayBuffer(50);
        int current = 0;
        while ((current = bis.read()) != -1) {
                baf.append((byte) current);
        }

        /* Convert the Bytes read to a String. */
        FileOutputStream fos = new FileOutputStream(file);
        fos.write(baf.toByteArray());
        fos.close();
        }
} catch (IOException e) {
        Log.d("ImageManager", "Error: " + e);
}
    return null;

}
4

1 に答える 1

0

おそらくボトルネックは、ByteArrayBuffer が 50 にしか設定されていないことだと思います。

これは、いくつかのファイルをダウンロードするために使用するコードです。

        @Override
    protected String doInBackground(Void... params) {
        String filename = "inputAFileName";

        HttpURLConnection c;
        try {
            URL url = new URL("http://someurl/" + filename);
            c = (HttpURLConnection) url.openConnection();
            c.setRequestMethod("GET");
            c.setDoOutput(true);
            c.connect();
        } catch (IOException e1) {
            return e1.getMessage();
        }

        File myFilesDir = new File(Environment
                .getExternalStorageDirectory().getAbsolutePath()
                + "/Download");

        File file = new File(myFilesDir, filename);

        if (file.exists()) {
            file.delete();
        }

        if ((myFilesDir.mkdirs() || myFilesDir.isDirectory())) {
            try {
                InputStream is = c.getInputStream();
                FileOutputStream fos = new FileOutputStream(myFilesDir
                        + "/" + filename);

                byte[] buffer = new byte[1024];
                int len1 = 0;
                while ((len1 = is.read(buffer)) != -1) {
                    fos.write(buffer, 0, len1);
                }
                fos.close();
                is.close();

            } catch (Exception e) {
                return e.getMessage();
            }

            if (file.exists()) {
                return "File downloaded!";
            } else {
                 Log.e(TAG, "file not found");
            }
        } else {
            Log.e(TAG, "unable to create folder");
        }
    }

試してみて、速度が速いかどうかを確認できます。

于 2013-11-06T23:59:57.683 に答える