2013-02-12 154 views
60

我對編程非常陌生,我有些疑惑。等待異步任務完成其工作

我有一個AsyncTask這是我打電話爲RunInBackGround

,我開始這個過程中,如:

new RunInBackGround().execute(); 

但我想等到這個電話是完成它的執行,在進行代碼的其他語句之前。

我該怎麼做?

有沒有辦法呢?

+0

AsyncTask的意義在於它是異步的,意味着它不與代碼的其餘部分同步。 – Gjordis 2013-02-12 07:30:41

+2

您可以使用它的onPostExecute()AsyncTask方法在您的類中獲取回調。 – DcodeChef 2013-02-12 07:32:59

+4

你並不想等到它完成。你想要知道什麼時候結束。 – njzk2 2013-02-12 07:51:18

回答

97

等待,直到該調用完成其執行

您需要調用AsyncTask.get()方法得到的結果返回並等待,直到doInBackground執行不徹底。但這將凍結主UI線程,如果你沒有調用線程內的get方法

要獲得導致回UI線程開始AsyncTask爲:

String str_result= new RunInBackGround().execute().get(); 
+1

所以如何等待結果和沒有得到主UI線程鎖定?! 說代碼等待結果但是同時,進度條不斷滾動! – 2015-11-10 07:39:26

+2

@MuhammadNaderi:不使用'get'方法使用'AsyncTask'並在AsyncTask中調用'onPostExecute'方法,它可以在主UI線程上提供u結果 – 2015-11-10 07:41:30

+1

確定這是一種解決方法,我已經使用了一段時間了,但有時候我需要等待asynctask的代碼,就像'c#'中的'await',而不是主線程鎖住當然 – 2015-11-10 07:57:55

29

優化雖然這將是很好,如果你的代碼可以並行運行,也可以是你只是使用線程,這樣的情況下即使您的應用程序的使用流程不得不等待它,也不會阻止UI線程。

這裏有兩個選項:

  1. 您可以在AsyncTask本身中執行您想要等待的代碼。如果它與更新UI(線程)有關,則可以使用onPostExecute方法。當您的後臺工作完成後,這會自動調用。

  2. 如果你出於某種原因被迫在Activity/Fragment/Whatever中執行它,你也可以讓自己成爲一個自定義的偵聽器,從AsyncTask中廣播出來。通過使用這個,你可以在你的Activity/Fragment /裏面有一個回調方法,不管什麼時候你只需要調用它:當你的AsyncTask完成任何你需要等待的時候。

+5

這是一個了不起的答案,應該是可以接受的。另外這裏是如何使用AsyncTasks實現這個示例:http://stackoverflow.com/questions/12575068/how-to-get-the-result-of-onpostexecute-to-main-activity-because-asynctask-is -a – 2015-09-18 15:27:50

13

在你AsyncTask添加一個ProgressDialog像:

private final ProgressDialog dialog = new ProgressDialog(YourActivity.this); 

您可以在onPreExecute()方法setMessage像:

this.dialog.setMessage("Processing..."); 
this.dialog.show(); 

,並在您onPostExecute(Void result)方法解散你的ProgressDialog

+0

感謝您提供這些附加信息。 – AndroidBeginner 2017-01-13 15:00:28

11

AsyncTask有四種方法..

onPreExecute -- for doing something before calling background task in Async 

doInBackground -- operation/Task to do in Background 

onProgressUpdate -- it is for progress Update 

onPostExecute -- this method calls after asyncTask return from doInBackground. 

,你可以打電話給你的工作就從onPostExecute()doInBackground()

返回onPostExecute是您需要實現什麼後調用。