Как вернуть статус завершения задачи в AsyncTask - PullRequest
2 голосов
/ 24 февраля 2011

Это связано с моим предыдущим постом Проблема с загрузкой нескольких файлов с помощью AsyncTask

Я пытаюсь загрузить два видеофайла, а также показать ProgressDialog во время процесса. Для этого я использую AsyncTask. Я хочу, чтобы 1-я загрузка завершилась, освободить память и начать 2-ю загрузку. Я написал следующий код для достижения этой цели, но, похоже, вторая загрузка никогда не начинается.

startDownload() {
   DownloadFileAsync d1 = new DownloadFileAsync();
   d1.execute(videoPath+fileNames[0],fileNames[0]);

   if(d1.getStatus()==AsyncTask.Status.FINISHED) {
     d1 = null;
     DownloadFileAsync d2 = new DownloadFileAsync();
     d2.execute(videoPath+fileNames[1],fileNames[1]);
   }
}

Есть ли способ вернуть мне статус завершения моего 1-го задания и затем запустить 2-е?

Ниже приведен код моего класса DownloadFileAsync:

class DownloadFileAsync extends AsyncTask<String, String, String> {

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        showDialog(DIALOG_DOWNLOAD_PROGRESS);
    }

    @Override
    protected String doInBackground(String... aurl) {
        int count;

        try {
            URL url = new URL(aurl[0]);
            URLConnection conexion = url.openConnection();
            conexion.connect();

            File root = android.os.Environment.getExternalStorageDirectory();

            int lenghtOfFile = conexion.getContentLength();
            Log.d("ANDRO_ASYNC", "Lenght of file: " + lenghtOfFile);

            InputStream input = new BufferedInputStream(url.openStream());
            OutputStream output = new FileOutputStream(root.getAbsolutePath() + "/videos/" + aurl[1]);

            byte data[] = new byte[1024];

            long total = 0;

            while ((count = input.read(data)) != -1) {
                total += count;
                publishProgress(""+(int)((total*100)/lenghtOfFile));
                output.write(data, 0, count);                    
            }
            output.flush();
            output.close();                
            input.close();

        } catch (Exception e) {}
        return null;

    }
    protected void onProgressUpdate(String... progress) {
         Log.d("ANDRO_ASYNC",progress[0]);
         mProgressDialog.setProgress(Integer.parseInt(progress[0]));
    }

    @Override
    protected void onPostExecute(String unused) {
        dismissDialog(DIALOG_DOWNLOAD_PROGRESS);
        tv.append("\n\nFile Download Completed!");
        sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+ Environment.getExternalStorageDirectory())));            
    }
}

Ответы [ 2 ]

1 голос
/ 24 февраля 2011

Как рекомендует DKIT Android, вы можете начать вторую загрузку с onPostExecute, но только если, например, download2 равен null

@Override
protected void onPostExecute(String unused) 
{

   if (d2 == null)
   {
       d2 = new DownloadFileAsync();
       d2.execute(videoPath+fileNames[1],fileNames[1]);    
   }    
}

Если вам нужно начать больше загрузок, просто напишите метод за пределами вашей асинхронной задачи, который проверит, какая загрузка должна начаться следующей.

1 голос
/ 24 февраля 2011

Начните вторую загрузку из первого метода onPostExecute.

protected void onPostExecute(String unused) {
        dismissDialog(DIALOG_DOWNLOAD_PROGRESS);
        tv.append("\n\nFile Download Completed!");
        sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+ Environment.getExternalStorageDirectory())));            

        // Here you start your new AsyncTask...
    }

Этот код:

if(d1.getStatus()==AsyncTask.Status.FINISHED) {
 d1 = null;
 DownloadFileAsync d2 = new DownloadFileAsync();
 d2.execute(videoPath+fileNames[1],fileNames[1]);

}

... будет выполнен один раз и сразу после первого AsyncTask, поэтому он всегда будет ложным. Если вы хотите пойти по этому пути, вам нужно сделать это в цикле while, что в первую очередь лишает смысла делать задачу асинхронной.

...