2013-02-14 92 views
0

我已經讀入AsyncTask,我獲得了大部分,但我仍然有一個小問題。簡單的AsyncTask - 返回值null

我基本上想要使用線程從聯機源檢索數據,並將其返回給活動。以下是一個簡單的僞代碼。

public class register extends Activity implements OnClickListener{ 

public static String dbData; 

    public static void setDBData(String data) 
    { 
     dbData = data; 
    } 

    //CALLED FROM ONCREATE() 
public void regPageTwo() 
{ 
    setContentView(R.layout.layout_register_two); 
    new dataExchange().execute(1); 
     Log.i("Data", dbData); 

} 

} 

public class dataExchange extends AsyncTask<Integer, Void, String>{ 

     @Override 
    protected String doInBackground(Integer... params) { 
     //EVENTUALLY DO OTHER COMPUTATION 
     String test="aTest"; 
     return test; 
    } 

    @Override 
    protected void onPostExecute(String result) 
    { 
     register.setDBData(result); 
    } 
} 

(對不起,我可憐的格式不太用它來使用這個還)。任何想法爲什麼dbData總是NULL?

在此先感謝

+0

試試這個:new dataExchange()。execute(「」); – 2013-02-14 12:56:48

+2

好像你在理解代碼流時遇到了問題,當你在使用異步操作時... AsyncTask(就像這個類的名字所述)被執行異步...所以不要指望'dbData'的值會是在你調用'new dataExchange()。execute(1);'(因爲執行不會等到任務完成後它只是觸發它),所以把'Log.i(「Data」,dbData) ;設置dbData之後''設置'setDBData' ... – Selvin 2013-02-14 12:58:23

回答

1
public void regPageTwo() 
{ 
    setContentView(R.layout.layout_register_two); 
    new dataExchange().execute(1); 
    Log.i("Data", dbData); 
} 

尋找你上面的代碼後,

Log.i("Data", dbData);應該在的AsyncTask的onPostExecute() ..

其實,你的代碼行Log.i("Data", dbData);之前完成的執行的AsyncTask。所以它始終是一個NULL你必須等待完整的AsyncTask。或者正如我建議把這條線放在onPostExecute()

1

因爲這條線將被執行:

Log.i("Data", dbData); 

後立即

new dataExchange().execute(1); 

但是,這條線將在一段時間在未來被執行:

register.setDBData(result); 

出現這種情況,因爲它運行asynchronously在不同的線程上。