Android调用AsyncTask()。get()而没有execute()?

时间:2015-09-04 10:19:30

标签: android-asynctask futuretask

我在尝试理解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()没有影响任何。

1 个答案:

答案 0 :(得分:1)

execute()安排内部FutureTask(通常在内部Executor上)并立即返回。

get()只是在这个内部未来调用FutureTask.get(),即等待(如果需要)结果。

因此,在不调用get()的情况下调用execute()会无限期地等待,因为结果永远不可用。

正如您所提到的,当以正常方式使用时,根本不需要get(),因为结果在onPostExecute()中处理。在我试图理解你的问题之前,我甚至都不知道它存在