尝试使用AsyncTask会下载一些图像文件

时间:2011-02-20 00:08:04

标签: android casting arraylist android-asynctask params

我有存储在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");
     }
}

1 个答案:

答案 0 :(得分:2)

您的AsyncTask是使用param类型的网址声明的,但您尝试传递String(或ArrayList)个对象。在调用程序中准备Array个URL对象,或修改DownloadFiles以接受String而不是URL参数,并将每个String转换为execute()中的URL方法。

更好的是,由于您从FilesToDownload内访问execute(),因此您无需向execute()传递任何内容,而您可以声明DownloadFiles的第一个通用参数} Void