的AsyncTask执行的功能
我使用的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执行时,它叫?
感谢
没有看到您的更多的代码是我很难告诉,但我会看看你在哪里调用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");
}
试试这个 -
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
new GCM().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,params);
} else {
new GCM().execute();
}
试着将你的新GCM().execute(null,null,null);
在保护无效onCreate(Bundle savedInstanceState)
方法。这种方式将在应用程序运行后调用。通过这种方式,您可以在使用LogMEIn
方法之前获得您的GCM
ID。
的AsyncTask保持的任务队列和线程池,线程池执行任务一个接一个,所以如果你有太多的任务,你会发现它不能立即执行任务。
而且在一个过程中,所有的AsyncTask共享一个线程pool.In这种情况下,你应该让自己一个任务队列,你可以使用HandleThread执行及时任务。
会立即执行。但你没有做任何事情。应该更好地查看文档。 –
“gcmRegID是一个公共变量,应该有现在分配给它GCM值” - 不,它不应该,因为你的任务是异步运行,这意味着它不会阻止,并经过'执行行()立即进行呼叫。 –
你在哪里调用'LogMeIn()'?尝试使用断点。 – petey