如何在 AsyncTask 中取回任务完成状态状态、任务、如何在、AsyncTask

2023-09-07 16:43:58 作者:彼岸花开落彼岸

这与我之前的帖子有关使用AsyncTask下载多个文件的问题

我正在尝试下载两个视频文件,并在此过程中显示 ProgressDialog.为此,我正在使用 AsyncTask.我希望第一次下载完成,释放内存然后开始第二次下载.我编写了以下代码来实现这一点,但似乎第二次下载永远不会开始.

I'm trying to download two video files and also show a ProgressDialog during the process. For this I'm using AsyncTask. I want the 1st download to complete, free up memory then start the 2nd download. I wrote the following code to achieve this, but it seems the 2nd download never begins.

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]);
   }
}

有没有办法让我恢复我的第一个任务的完成状态?然后开始第二次?

Is there a way that I can get back the completion status of my 1st task & then start the 2nd ?

以下是我的 DownloadFileAsync 类的代码:

The following is the code of my DownloadFileAsync class:

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("

File Download Completed!");
        sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+ Environment.getExternalStorageDirectory())));            
    }
}

推荐答案

正如 DKIT Android 建议的那样,您可以从 onPostExecute 开始第二次下载,但前提是例如 download2 为空

As DKIT Android suggested, you could start the second download from onPostExecute, but only if for example download2 is null

@Override
protected void onPostExecute(String unused) 
{

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

如果你需要开始更多的下载,只需在你的 asynctask 之外编写方法,它会检查下一个应该开始的下载.

If you need to start more downloads, just write the method outside of your asynctask, which will check which download should be started next.