AsyncTask: куда идет возвращаемое значение doInBackground ()?
при вызове AsyncTask<Integer,Integer,Boolean>
, где находится возвращаемое значение:
protected Boolean doInBackground(Integer... params)
?
обычно мы начинаем с AsyncTask new AsyncTaskClassName().execute(param1,param2......);
но он, кажется, не возвращает значение.
где можно вернуть значение doInBackground()
нашли?
2 ответа:
стоимостью в onPostExecute который вы можете переопределить, чтобы работать с результатом.
вот пример фрагмента кода из документов Google:
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)); } return totalSize; } protected void onProgressUpdate(Integer... progress) { setProgressPercent(progress[0]); } protected void onPostExecute(Long result) { showDialog("Downloaded " + result + " bytes"); } }
вы можете вернуть возвращаемое значение protected Boolean
doInBackground()
по телефону get () методAsyncTask
класс :AsyncTaskClassName task = new AsyncTaskClassName(); bool result = task.execute(param1,param2......).get();
но будьте осторожны с отзывчивостью пользовательского интерфейса, потому что
get()
ждет завершения вычисления и будет блокировать поток пользовательского интерфейса.
Если вы используете внутренний класс, лучше выполнить задание в методе onPostExecute(Boolean result).если вы просто хотите обновить UI,
AsyncTask
предлагает вам два posibilites :
чтобы обновить пользовательский интерфейс параллельно с задачей, выполняемой в doInBackground()
(например, чтобы обновить aProgressBar
), вам придется позвонитьpublishProgress()
внутриdoInBackground()
метод. Затем вы должны обновить пользовательский интерфейс вonProgressUpdate()
метод.чтобы обновить пользовательский интерфейс, когда задача будет выполнена, вы должны сделать это в onPostExecute()
метод./** This method runs on a background thread (not on the UI thread) */ @Override protected String doInBackground(String... params) { for (int progressValue = 0; progressValue < 100; progressValue++) { publishProgress(progressValue); } } /** This method runs on the UI thread */ @Override protected void onProgressUpdate(Integer... progressValue) { // TODO Update your ProgressBar here } /** * Called after doInBackground() method * This method runs on the UI thread */ @Override protected void onPostExecute(Boolean result) { // TODO Update the UI thread with the final result }
таким образом, вы не должны заботиться о проблемах отзывчивости.