AsyncTask:doInBackground()的返回值在哪里去?
当调用AsyncTask<Integer,Integer,Boolean>
,其中的返回值为:
protected Boolean doInBackground(Integer... params)
?
通常我们用new AsyncTaskClassName().execute(param1,param2......);
启动AsyncTask new AsyncTaskClassName().execute(param1,param2......);
但它似乎没有返回一个值。
哪里可以finddoInBackground()
的返回值?
然后可以在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"); } }
您可以通过调用AsyncTask
类的get()方法来检索protected Boolean doInBackground()
的返回值:
AsyncTaskClassName task = new AsyncTaskClassName(); bool result = task.execute(param1,param2......).get();
但要小心UI的响应,因为get()
等待计算完成并将阻塞UI线程 。
如果您正在使用内部类,最好将这个作业放到onPostExecute(布尔结果)方法中。
如果你只是想更新用户界面, AsyncTask
为你提供了两个可能:
doInBackground()
执行的任务并行地更新UI(例如更新ProgressBar
),您必须在doInBackground()
方法内调用publishProgress()
。 然后,您必须更新onProgressUpdate()
方法中的UI。 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 }
这样你就不必关心响应性问题。