2013-07-10 29 views
0

對不起,作爲一個新手,我到處看,我只是不明白。將參數添加到AsyncTask的目的是什麼?

Asynctask需要3個參數;例如

但這些參數的重點是什麼?

我試圖運行在一個單獨的線程一個地理編碼器,我有這個

private class GetCurrentCity extends AsyncTask<String, Void, Void>{ 

,但我從字面上做這些參數了。我不知道我應該放在那裏。除了已經在doInBackground()中的代碼行外,我不需要任何進度條或任何其他線程。然後我需要一個字符串從那裏返回,並且我正在使用onPostExecute(String returnedAddress)。

我很困惑。請幫助!

+0

是你在另一個文件中的asynctask,或者它是你的活動類的內部類 – Raghunandan

回答

0

而不是API引用,這裏是更多一點說明。首先,很多人會使用AsyncTask內聯作爲匿名類;記住這一點。看起來你已經用自己的類擴展了它(這是完全正確的),但它可能意味着你在構造函數中傳遞了必要的數據並將它作爲類變量引用。在這種情況下,一些論點不會有多大意義。

因此,描繪一個AsyncTask的匿名內聯類。它要做的第一件事是在後臺運行一些處理。爲此,您需要一種將數據傳遞給doInBackground方法的方法(因爲您沒有構造函數來調用並傳遞數據)。所以第一個參數是你要傳遞給它的數據類型。如果你不必傳遞任何東西,使用Void,或者使用Object,或者其他的東西,真的,因爲它必須是方法簽名的一部分,但是無論如何你都會忽略它。

對於很多情況,人們會想要提供進度更新。例如,您可以使用Float類型來表示完成百分比,或者使用Long來表示從文件讀取的字節,或者使用字符串來向用戶發送一般消息。您可以使用進度類型傳遞臨時進度信息(考慮將文件上傳到臉書或下載文件,它會隨着進度更新通知狀態 - 這是您在哪裏/如何執行此操作)。你說過你並不關心你的情況,所以使用Void並且不要執行任何進度方法。

最後,當任務完成時,您需要到onPostExecute中的結果。所以你的doInBackground會返回一個值(這種類型),而AsyncTask框架會將它傳遞給onPostExecute。再次,這對於沒有更多身體的匿名類更有意義。如果你在班級成員中持有任何結果,那也可以(但不必要)。如果您不需要完成任何操作,或者不需要傳遞任何數據,請使用Void(並從doInBackground返回null)。我發現至少返回一個布爾值表示「已成功完成或失敗」是有用的,因此您擁有這些信息(這可能會影響您發佈成功還是失敗通知,因爲完成任務的通知是常見的onPostExecute操作)。

希望一些更多的解釋與例子有所幫助。

+0

完美。比我在過去一小時內已經閱讀10億次的API答案要好得多。謝謝! –

2

AsyncTask

由異步任務中使用的三種類型的文檔如下:

  • PARAMS,發送到在執行時任務的參數的類型。
  • 進度,在 背景計算期間發佈的進度單位的類型。
  • 結果,後臺計算

並非所有類型總是使用異步任務的結果的類型。爲了紀念一個類型爲未使用時,只需使用void類型:

private class MyTask extends AsyncTask<Void, Void, Void> { ... } 
+1

是好的,清晰的答案在這裏有良好的文檔引用。詳細闡述一下,一個好的,實際的用途是例如發送一個特殊的類作爲第一個(「Params」)參數和最後一個(「Result」)參數,這樣doInBackground()方法將第一個作爲參數並返回最後一個,例如'AsyncTask >'將有一個方法'protected List doInBackground(String ... strings)'。希望這可以幫助。 –

0

這些都是當你想在執行或runInBackground和onPostExecute之間傳遞的時候把什麼東西。你可以簡單地在類聲明中做出全部三個Void。

AsyncTask | Android Developers

由異步任務中使用的三種類型的有以下幾種:

  1. PARAMS,發送到在執行時任務的參數的類型。
  2. 進度,在 背景計算期間發佈的進度單位的類型。
  3. 結果,後臺計算結果的類型。

並非所有類型總是由異步任務使用。要將某個類型標記爲未使用,只需使用類型Void:

private class MyTask extends AsyncTask<Void, Void, Void> { ... } 
相關問題