我在尝试理解AsyncTask().get()
实际上是如何运作时遇到了问题。我知道这是synchronous
执行,但是:我不知道execute()
和get()
是如何连接的。
我有来自Google文档的示例代码:
// Async Task Class
class DownloadMusicfromInternet extends AsyncTask<String, String, String> {
// Show Progress bar before downloading Music
@Override
protected void onPreExecute() {
super.onPreExecute();
Log.d("Task: ", "onPreExecute()");
}
// Download Music File from Internet
@Override
protected String doInBackground(String... f_url) {
for (int i = 0; i < 100; i++){
try {
Thread.sleep(100);
Log.d("Task: ", String.valueOf(i));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return null;
}
// While Downloading Music File
protected void onProgressUpdate(String... progress) {
// Set progress percentage
Log.d("Task: ", "onProgressUpdate()");
}
// Once Music File is downloaded
@Override
protected void onPostExecute(String file_url) {
Log.d("Task: ", "onPostExecute()");
}
}
现在,从button.onClick()
我用3种方式调用它:
new DownloadMusicfromInternet().execute("");//works as expected, the "normal" way
//works the normal way, but it's synchronous
try {
new DownloadMusicfromInternet().execute("").get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
//does not work
try {
new DownloadMusicfromInternet().get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
我很惊讶execute()
如何触发doInBackground()
,然后在调用get()
后立即返回,而get()
对doInBackground()
没有影响任何。
答案 0 :(得分:1)
execute()
安排内部FutureTask
(通常在内部Executor
上)并立即返回。
get()
只是在这个内部未来调用FutureTask.get(),即等待(如果需要)结果。
因此,在不调用get()
的情况下调用execute()
会无限期地等待,因为结果永远不可用。
正如您所提到的,当以正常方式使用时,根本不需要get()
,因为结果在onPostExecute()
中处理。在我试图理解你的问题之前,我甚至都不知道它存在