-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执行及时任务。