我正在从本教程中阅读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 ...∞个具有某种类型的参数。
让我知道是否仍然不清楚