0

asynctaskWeb からファイルにダウンロードするクラスを1 つ作成します。

これは私のクラスです:

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

    private boolean done = false;
    @Override
    protected String doInBackground(String... sUrl) {
        done = false;
        if (isOnline() == true && sdmounted() == true) {
            try {
                URL url = new URL(sUrl[0]);  // get url
                HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                connection.connect();
                InputStream in = new BufferedInputStream(connection.getInputStream());
                // url[1]= file name
                OutputStream out = (downloaded == 0) ? new FileOutputStream("/sdcard/Points.ir/" + sUrl[1])
                        : new FileOutputStream("/sdcard/Points.ir/"
                                + sUrl[1], true);
                OutputStream output = new BufferedOutputStream(out, 1024);
                byte[] data = new byte[1024];
                int count = 0;

                while (done != true && isOnline() == true && (count = in.read(data, 0, 1024)) >= 0) {
                    output.write(data, 0, count);
                    downloaded += count;
                }
                output.flush();
                output.close();
                in.close();
            } catch (Exception e) {
            }
        } else {
            networkerror = 1;
        }
        return null;
    }

    @Override
    protected void onPreExecute() 
    {
        super.onPreExecute();

    }

    @Override
    protected void onProgressUpdate(Integer... progress)
     {
        super.onProgressUpdate(progress);

    }

    @Override
    protected void onPostExecute(String result) 
    {
        super.onPostExecute(result);

    }
}

このクラスのオブジェクトを作成して実行すると、すべて正常に動作します。しかし、2つのオブジェクトを作成し、同時に2つのファイルをダウンロードするために実行すると、FCが得られますか?? 私は何をしますか?(英語が下手でごめんなさい)

4

1 に答える 1

1

AsyncTask は 1 回しか実行できません。したがって、AsyncTask が実行されると、再度実行することはできません。これが、doInBackground メソッドに String... param がある理由です。これは、String のリストにすることができます。

したがって、2 つのオブジェクトを作成する代わりに、次のオブジェクトを使用できます。

DownloadFile1 task = new DownloadFile1();
task.execute("url1", "url2", "url3");   // All these urls will be processed after each other

それよりも、AsyncTask doInBackground() では、次のようなことができます。

@Override
protected String doInBackground(String... sUrl) {
    done = false;

    for(int i=0 ; i < sUrl.length ; i++){
        if (isOnline() == true && sdmounted() == true) {
            try {

                String currentUrl = sUrl[i];

                // continue with your code here, using currentUrl instead
                // of using sUrl[0];
            }
        }
    }

}
于 2012-12-05T09:58:26.973 に答える