2013-04-24 131 views
0

我有這樣的代碼onPostExecute()doInBackground(後不執行)

public class AsyncClassTest extends Activity { 

String strMessage; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    new MyClass().execute(); 

    Toast.makeText(AsyncClassTest.this, strMessage, Toast.LENGTH_LONG) 
      .show(); 

} 

public class MyClass extends AsyncTask<String, Void, String> { 

    @Override 
    protected String doInBackground(String... params) { 
     return "Hello world!!!"; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     strMessage = result; 
    } 
} 

}

並運行時,new MyClass().execute();之後它表明strMessage爲空,並顯示後舉杯代碼放在onPostExecute()方法,如何使代碼運行並在顯示消息後new MyClass().execute();

+2

開始顯示在'onPostExecute敬酒執行() ' – 2013-04-24 10:09:31

+0

哦,大家都寫了同樣的答案..:P – Sunny 2013-04-24 10:38:25

+0

@孫尼很難挑選接受的答案 – pepela 2013-04-24 12:32:46

回答

1
Toast.makeText(AsyncClassTest.this, strMessage, Toast.LENGTH_LONG) 
    .show(); 

刪除它形成onCreate,它在onPostExecute

寫在你的代碼,吐司執行之前,你的AsyncTask進來的行動,永遠記住,AsyncTask是背景thread

0

您正在設置字符串的值爲AsyncTask。當你調用execute()時,它將異步運行(一個單獨的線程),Toast將很可能在字符串的值被設置之前顯示。

基本上,execute()不會「等待」調用onPostExecute。它產生了一個單獨的線程,並且您的方法繼續以舊值顯示Toast。

嘗試將Toast.makeText轉換爲onPostExecute命令以查看其工作。

此外,如果你真的想onPostExecute完成執行,然後再轉移到吐司。你真的不應該爲此使用AsyncTask

0
@Override 
    protected void onPostExecute(String result) { 
     strMessage = result; 

Toast.makeText(AsyncClassTest.this, strMessage, Toast.LENGTH_LONG) 
      .show(); 

    } 

onPostExecute(Result),在後臺計算完成後在UI線程上調用。背景計算的結果作爲參數傳遞給此步驟

0

顧名思義,AsyncTask是異步運行的東西,因此您不能只是​​它,並且期望它在下一行代碼獲得之前返回調用。因此,您應該在(或在onPostExecute()中調用的方法中)內部創建Toast,因爲被調用時確信任務已完成。

1
public class AsyncClassTest extends Activity { 

String strMessage; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    new MyClass().execute(); 

} 

public class MyClass extends AsyncTask<Void, Void, String> { 
    @Override 
    protected String doInBackground(Void... arg0) { 
     return "Hello world!!!"; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     strMessage = result; 
     Toast.makeText(AsyncClassTest.this, strMessage, Toast.LENGTH_LONG).show(); 
    } 

} 
} 
0

AsyncTask正如名字所示,是異步的。這意味着它不necessarly下一行

之前,如果你有一個操做後任務完成後,一定要做或onPostExecute

相關問題