我正在使用AsyncTask,以便我想要的函数立即执行,而不是等到结束才能执行..
但由于某种原因,我不知道为什么它会在所有过程结束时执行!
我查看了其他解决方案,发现Thread应该在最后执行,但对于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;
}
}
我试图在onPreExecute中调用GCMRegister,但是我得到一个错误,它必须在主线程中
就像我要进入圈子......
调用必须在主线程中,主线程将在函数结束时执行...
这就像是无法将GCM代码放在中间!!!!
如何在调用??
时执行此AsyncTask由于
答案 0 :(得分:2)
如果没有看到更多的代码,我很难说,但我会看看你在哪里调用LogMeIn()。因为AsyncTask和execute to execute嵌套在LogMeIn()函数中,所以在第一次调用LogMeIn()之前不会调用它。
AsyncTask在调用execute()之后按顺序执行以下4个步骤:
可以将这些添加到GCM类中,然后根据需要使用。请注意,您不直接调用它们。 AsyncTask在调用.execute()后自动执行。
只在doInBackground(Params ...)中指定的任务在后台线程上执行。其余的都是在UI(或主要)线程上完成的。我建议在onPreExecute()和onPostExecute()中放入一个toast或一个日志来调试GCM()。execute实际被调用的地方/时间,然后告诉你后台任务何时完成。这将使您更好地了解正在发生的事情。
确保您没有尝试在doInBackground()中更新UI。
愿意提供更多帮助,但我们需要查看更多代码。
@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");
}
答案 1 :(得分:1)
试试这个 -
if( Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB ) {
new GCM().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,params);
} else {
new GCM().execute();
}
答案 2 :(得分:1)
尝试将新的GCM().execute(null,null,null);
放入受保护的void onCreate(Bundle savedInstanceState)
方法中。这样,一旦应用程序运行,它将被调用。这样,在进入GCM
方法之前,您将获得LogMEIn
个ID。
答案 3 :(得分:1)
AsyncTask保留一个任务队列和一个线程池,线程池逐个执行任务,所以如果你有太多的任务,你会发现它不会立即执行你的任务。
在一个进程中,所有AsyncTask共享一个线程池。在这种情况下,您应该自己创建一个任务队列,您可以使用HandleThread来执行及时的任务。