我正在从本教程中阅读AsyncTask。并以下面的代码为例:

private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
     protected Long doInBackground(URL... urls) {
         int count = urls.length;
         long totalSize = 0;
         for (int i = 0; i < count; i++) {
             totalSize += Downloader.downloadFile(urls[i]);
             publishProgress((int) ((i / (float) count) * 100));
             // Escape early if cancel() is called
             if (isCancelled()) break;
         }
         return totalSize;
     }

     protected void onProgressUpdate(Integer... progress) {
         setProgressPercent(progress[0]);
     }

     protected void onPostExecute(Long result) {
         showDialog("Downloaded " + result + " bytes");
     }
 }


“一旦创建,任务将非常简单地执行:”

new DownloadFilesTask().execute(url1, url2, url3);


我对此有两个问题:


totalSize += Downloader.downloadFile(urls[i]);行做什么?我猜测totalSize会存储下载文件的大小,而Downloader.downloadFile(urls[i])从传入的URL中下载文件并返回下载文件的大小。我对吗?
这个问题是关于java中的泛型类型的。从,我认为我们正在将三个不同的URL(将从中下载文件的网址)传递给参数化的类DownloadFilesTask。但是类声明(private class DownloadFilesTask extends AsyncTask<URL, Integer, Long>)中的类型参数是URL,Integer和Long?为什么?网址对象如何转换为整数?我认为我在某个地方犯错了,请纠正我,我将不胜感激。


谢谢。

最佳答案

如果我们看这行:

showDialog(“ Downloaded” + result +“ bytes”);
我们可以理解Downloader.downloadFile返回文件的大小(以字节为单位)。所以你是对的。
只需看一下这段代码,您就会了解参数化

public abstract class AsyncTask < Params, Progress, Result> {

      protected abstract Result doInBackground(Params... params);

      protected void onPostExecute(Result result) {}

      protected void onProgressUpdate(Progress... values) {}
}



...(3个点)-这意味着您可以在此处传递1,2,3 ...∞个具有某种类型的参数。

让我知道是否仍然不清楚

09-12 16:20