2011-08-17 38 views
1

我已經構建了一個完全可用的AsyncTask來處理設備授權,但唯一的問題是我有麻煩讓結果Bundle返回到其實例化變量以繼續處理主活動。這裏是的AsyncTask實例:將AsyncTask的結果返回到它的實例化變量

Bundle taskResult = new AuthorizeDevice(this).execute(passToAuthroization).get(); 

我讀過一些文獻關於這個問題,發現onPostExecute()方法可能有一些做這一點,所以考慮到這一點那就是:

protected void onPostExecute(Bundle result){ 
    dialog.dismiss(); 
    Toast.makeText(context, "background process finished: "+result.getString("UDID"), Toast.LENGTH_SHORT).show(); 
} 

那麼我怎樣才能讓那個包回到主要活動?

+0

爲什麼綁定。我不確定。有一件事是,如果你在** doInBackground **中遇到**異常**,那麼你會在** onPostExecute ** – Samuel

+0

中得到一個空值,並且嘗試訪問'UDID'的敬酒僅僅用於調試。我已經制定了一個預定義的方式來捕獲並通過捆綁包發送異常,以便通知用戶問題。 – nkcmr

+0

查看PravinCG的回答。他是對的。你必須想出一個等待機制或**從onPostExecute以某種方式拋出捆綁。 – Samuel

回答

1

result初始化它定義了諸如

public interface AuthorisationCallback() { 
     void onFinish(Bundle bun); 
}; 

回調接口實現此接口並做你想做的同捆。

AuthorisationCallback mAuthcallback = new AuthorisationCallback() { 
    void onFinish(Bundle bun) { 
     // Do what ever with the bundle. 
    } 
}; 

發送它的實現參考的AsyncTask

new AuthorizeDevice(mAuthcallback).execute(passToAuthroization); 

在onPostexecute()做

protected void onPostExecute(Bundle result){ 
    dialog.dismiss(); 
    mCallback.onFinish(result); 
} 
+0

好的,但我怎麼能重定向到onFinish的另一個活動,我不能通過它的上下文,或開始一個意圖 – max4ever

2

AsyncTask是一個非阻塞的調用,你不能以你想要的方式獲得包。然而,你可以做的是在AsyncTask中創建一個接口,它會告訴你什麼時候完成。就像onTaskComplete一樣,你可以在那裏傳遞結果包。

+0

+1我錯過了instanation部分。是的AsyncTask是非阻塞的。 – Samuel

0

正如你所見,onPostExecute()方法的返回類型是void。所以它不會返回任何東西。所以大概可以使Bundle taskResult一個實例變量和postExecute

1

首先,看一下API接近。

我需要查看更多的代碼才能知道您要做什麼,但PravinCG是正確的,您使用AsyncTask.execute()呼叫的方式不正確。如果你想返回值,從onPostExecute()

看起來你已經開始與子類AsyncTask<?,?,?>這是要走的路,如果你需要訪問活動得到它,你能不能簡單地將子類的AsyncTask你活動課?這將允許您從onPostExecute()中訪問Activity的方法,這是通過UI線程上的設計實現的。 (同樣,需要看到更多的代碼才能知道這是多麼可行,只是把它放在那裏)。 如果沒有,只需將對您的Activity的引用傳遞到您的AsyncTask子類中,並使用公共方法從onPostExecute返回Bundle,或使用接口,因爲已經建議...