我有存储在arraylist中的文件列表,我需要在后台线程中下载。我最初的想法是AsyncTask应该完成这项任务。但是,我有一个问题,我不知道如何将我的列表提供给doInBackground方法。
我的arraylist被定义为
private ArrayList<String> FilesToDownload = new ArrayList<String>();
应该使用以下命令调用我的DownloadFiles子类(现在编写它的方式) new DownloadFiles()。execute(url1,url2,url3等);
这不适合我,因为我从来不知道会有多少网址。它随着时间的推移而变化很大。所以,我想以某种方式将我的arraylist传递给doInBackground方法。
我尝试使用toArray()转换为数组:
new DownloadFiles().execute(FilesToDownload.toArray());
但是,eclipse告诉我,执行不适用于参数Object []。 建议是转换为URL [],但是当我尝试时,我得到了非法的转换错误,应用程序崩溃了。
似乎必须使用varargs类型(URL ... urls)中的参数实现doInBackground。
任何想法如何解决我的问题?感谢。
class DownloadFiles extends AsyncTask<URL, Integer, Long> {
protected Long doInBackground(URL... urls) {
int count = urls.length;
long totalSize = 0;
for (int i = 0; i < count; i++) {
Log.d("Evento", "&&&& downloading: " + FilesToDownload.get(i).toString());
// totalSize += Downloader.downloadFile(urls[i]);
// publishProgress((int) ((i / (float) count) * 100));
}
return totalSize;
}
protected void onProgressUpdate(Integer... progress) {
//setProgressPercent(progress[0]);
}
protected void onPostExecute(Long result) {
//showDialog("Downloaded " + result + " bytes");
}
}
答案 0 :(得分:2)
您的AsyncTask
是使用param类型的网址声明的,但您尝试传递String
(或ArrayList
)个对象。在调用程序中准备Array
个URL对象,或修改DownloadFiles
以接受String
而不是URL参数,并将每个String
转换为execute()
中的URL方法。
更好的是,由于您从FilesToDownload
内访问execute()
,因此您无需向execute()
传递任何内容,而您可以声明DownloadFiles
的第一个通用参数} Void
。