-1

我使用的AsyncTask結束,這樣我想要的功能將立即執行,不會等到要執行到底..的AsyncTask執行的功能

,但由於某種原因,我爲什麼不執行在所有的過程結束!

我看了看其他的解決方案,發現線程應該在年底執行,但對於每次的AsyncTask它被稱爲應當執行..

這裏是我的代碼

private void LogMeIn() 
{ 

     string CheckValue; 

     // Here I call the AsyncTask 

     new GCM().execute(null,null,null); 

     //gcmRegID is a public variable and should has GCM value assigned to it by now, but I it is empty as GCM() has not been executed yet 

      //This is always return empty string 
      CheckValue = gcmRegID; 
} 

這是那的AsyncTask等到年底執行

//This is the AsyncTask 
private class GCM extends AsyncTask<String, String, String> { 

     private String resp; 
     private Context context; 



     @Override 
     protected String doInBackground(String... params) { 
      GCMHelper gcmRegistrationHelper = new GCMHelper (
        getApplicationContext()); 

      try { 
       gcmRegID = gcmRegistrationHelper.GCMRegister("123456789"); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 

      return gcmRegID; 
     } 


} 

我試圖把呼籲GCMRegister在onPreExecute,但我得到的是它必須是在主要的錯誤螺紋

這就像我在圈子裏我要去....

調用必須是在主線程和主線程將在函數結束時執行...

它是沒有辦法讓中間的GCM代碼!!!!

我怎樣才能使這個AsyncTask執行時,它叫?

感謝

+0

會立即執行。但你沒有做任何事情。應該更好地查看文檔。 –

+3

「gcmRegID是一個公共變量,應該有現在分配給它GCM值」 - 不,它不應該,因爲你的任務是異步運行,這意味着它不會阻止,並經過'執行行()立即進行呼叫。 –

+0

你在哪裏調用'LogMeIn()'?嘗試使用斷點。 – petey

回答

2

沒有看到您的更多的代碼是我很難告訴,但我會看看你在哪裏調用LogMeIn的()。因爲您的AsyncTask和調用執行嵌套在LogMeIn()函數中,所以直到首次調用LogMeIn()時纔會調用它。

的AsyncTask經過以下4個步驟才能調用execute()後:

  • onPreExecute()
  • doInBackground(參數...)
  • onProgressUpdate(進展...)
  • onPostExecute(結果)

這些可以添加到您的GCM類和使用,但是你喜歡。請注意,你不直接打電話給他們。 AsyncTask在調用.execute()後自動執行。

只有在doInBackground(Params ...)中指定的任務在後臺線程上執行。其餘全部都在UI(或主)線程上完成。我建議在onPreExecute()和onPostExecute()中放置Toast或者一個日誌來調試GCM()。execute的實際被調用的位置/時間,然後告訴你後臺任務何時完成。這會讓你更好地瞭解發生了什麼。

確保您沒有嘗試更新doInBackground()中的用戶界面。

想幫助更多,但我們需要看到更多的代碼。

@Override 
public void onPreExecute() { 
    super.onPreExecute(); 

    Log.d("GCM", "onPreExecute: called"); 
} 

@Override 
public void onPostExecute(String resultOfDoInBackground) { 
    super.onPostExecute(resultOfDoInBackground); 

    Log.d("GCM", "onPostExecute: called"); 
} 
+0

我試圖把呼叫GCMRegister在onPreExecute,但我得到一個錯誤,它必須在主線程 這就像我正在圈子...... 該調用必須在主線程而主線程將在函數結束時執行... 它就像沒有辦法讓中間的GCM代碼!!!! – asmgx

+1

好吧,我想我想通了你想做什麼。您試圖將gcmRegId的值設置爲AsyncTask的doInBackground的返回值,是否正確? –

+0

我想獲取GCM代碼並將其設置在公共變量gcmRegID – asmgx

1

試試這個 -

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 
    new GCM().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,params); 
} else { 
    new GCM().execute(); 
} 
1

試着將你的新GCM().execute(null,null,null);在保護無效onCreate(Bundle savedInstanceState)方法。這種方式將在應用程序運行後調用。通過這種方式,您可以在使用LogMEIn方法之前獲得您的GCM ID。

1

的AsyncTask保持的任務隊列和線程池,線程池執行任務一個接一個,所以如果你有太多的任務,你會發現它不能立即執行任務。

而且在一個過程中,所有的AsyncTask共享一個線程pool.In這種情況下,你應該讓自己一個任務隊列,你可以使用HandleThread執行及時任務。