Пытаясь использовать AsyncTask, загрузите некоторые файлы изображений.

У меня есть список файлов, хранящихся внутри массива, которые мне нужно загрузить в фоновом потоке. Моя первоначальная мысль заключалась в том, что AsyncTask должен быть готов для этой задачи. Но у меня проблема, я не знаю, как передать свой список методу doInBackground.

Мой arraylist определяется как

private ArrayList<String> FilesToDownload = new ArrayList<String>();

Мой подкласс DownloadFiles (как он написан сейчас) должен вызываться с помощью: new DownloadFiles().execute(url1, url2, url3 и т.д.);

Это не подходит для меня, так как я никогда не знаю, сколько URL-адресов у меня будет. Он довольно сильно меняется от случая к случаю. Итак, я хотел бы как-то передать мой массив в метод doInBackground.

Я попытался преобразовать в массив с помощью toArray():

new DownloadFiles().execute(FilesToDownload.toArray());

Но eclipse говорит мне, что выполнение не применимо к аргументу Object[]. Предложение состояло в том, чтобы привести к URL [], но когда я попытался это сделать, я получил незаконную ошибку приведения, и приложение разбилось.

Кажется, что doInBackground должен быть реализован с параметрами типа varargs (URL... URL).

Любые идеи, как решить мою проблему? Спасибо.

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

person bobetko    schedule 20.02.2011    source источник


Ответы (1)


Ваш AsyncTask объявлен с типом параметра URL, но вы пытаетесь передать объекты String (или ArrayList). Либо подготовьте Array объектов URL в вызывающей программе, либо измените DownloadFiles, чтобы принять String вместо параметров URL, и преобразуйте каждый String в URL в методе execute().

Еще лучше, поскольку вы получаете доступ к FilesToDownload из execute(), вам не нужно ничего передавать в execute(), и вы можете объявить первый общий параметр DownloadFiles как Void.

person Ted Hopp    schedule 20.02.2011