В приведенном вами примере ...
private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {...}
Три типа URL, Integer и Long (известные как Params, Progress, Result), могут быть любыми.
Первый (URL
) - это тип параметра, который вы должны передать методу .execute(<params>)
вашего экземпляра AsyncTask
.Точнее, когда вы посмотрите на метод doInBackground()
, вы увидите URL...
, что в основном означает, что он примет массив URL
.Даже если вам нужно передать только один URL
, вы все равно должны передать его как массив из одного элемента
URL[] myURLs = new URL[] {<comma-separated URLs here>};
new DownloadFilesTask().execute(myURLs);
В методе doInBackground(URL... urls)
вы получаете доступ к URL
s как urls[0]
, urls[1]
и т. Д. Или что-то вроде for (URL u:urls)
.
Второй типовой тип в этом примере (Integer
) - это тип, ожидаемый onProgressUpdate(Integer progress)
.Опять же, это должно быть передано в виде массива.Например, если вы загружаете 10 файлов, вызывайте его после загрузки каждого файла.Например, myProgress[0] = 1
, чтобы указать, что один файл был успешно загружен.Это позволяет вам обновить какой-либо диалог прогресса.
Наконец, третий универсальный тип (Long
) снова используется для внутреннего использования, и тип onDoInBackground(...)
должен возвращаться и передаваться в onPostExecute(Long result)
.Обратите внимание, что это единственный результат, а не массив.В зависимости от того, каков ваш результат, будет зависеть от того, как onPostExecute()
должен вести себя.
Как я уже сказал, вы можете использовать любые типы, включая универсальный Void
(примечание заглавной буквы) ...
private class MyAysncTask extends AsyncTask<Void, Void, Void>
В этом случае вы ничего не передаете .execute()
и, хотя вы все равно можете позвонить publishProgress()
(позвонить onProgressUpdate()
), вы не можете передать ему какие-либо данные.Точно так же onPostExecute
не получит никаких фактических данных результата.