Java AsyncTask在函数末尾执行
我正在使用AsyncTask,以便我想要的函数立即执行,而不是等到最后才执行 但由于某些原因,我不知道为什么它在所有进程结束时执行 我查看了其他解决方案,发现线程应该在最后执行,但对于AsyncTask,它应该在调用时执行 这是我的密码Java AsyncTask在函数末尾执行,java,android,android-studio,android-asynctask,google-cloud-messaging,Java,Android,Android Studio,Android Asynctask,Google Cloud Messaging,我正在使用AsyncTask,以便我想要的函数立即执行,而不是等到最后才执行 但由于某些原因,我不知道为什么它在所有进程结束时执行 我查看了其他解决方案,发现线程应该在最后执行,但对于AsyncTask,它应该在调用时执行 这是我的密码 private void LogMeIn() { string CheckValue; // Here I call the AsyncTask new GCM().execute(null,nul
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;
}
这是等待执行到结束的异步任务
//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;
}
}
//这是异步任务
私有类GCM扩展了异步任务{
私有字符串resp;
私人语境;
@凌驾
受保护的字符串doInBackground(字符串…参数){
GCMHelper gcmRegistrationHelper=新的GCMHelper(
getApplicationContext());
试一试{
gcmRegID=gcmrregistrationhelper.GCMRegister(“123456789”);
}捕获(例外e){
e、 printStackTrace();
}
返回gcmRegID;
}
}
我试图将对GCMRegister的调用放在onPreExecute中,但我得到一个错误,它必须在主线程中 我好像在兜圈子 调用必须在主线程中,主线程将在函数结束时执行
这是没有办法获得GCM代码在中间!!!!p> 如何使此AsyncTask在调用时执行
谢谢试试这个-
if( Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB ) {
new GCM().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,params);
} else {
new GCM().execute();
}
如果没有看到更多的代码,我很难说出来,但我想看看您在哪里调用LogMeIn()。由于AsyncTask和对execute的调用嵌套在LogMeIn()函数中,因此在首次调用LogMeIn()之前不会调用它 AsyncTask在调用execute()后按顺序执行以下4个步骤:
- onPreExecute()
- doInBackground(参数…)
- onProgressUpdate(进度…)
- onPostExecute(结果)
@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");
}
尝试放置新的
GCM().execute(null,null,null)代码>在受保护的voidonCreate(Bundle savedInstanceState)
方法中。这样,一旦应用程序运行,它就会被调用。这样,在使用LogMEIn
方法之前,您将拥有GCM
id。AsyncTask保留一个任务队列和一个线程池,线程池逐个执行任务,因此如果任务太多,您将发现它不会立即执行任务
在一个进程中,所有AsyncTask共享一个线程池。在这种情况下,您应该自己创建一个任务队列,您可以使用HandletThread及时执行任务。它会立即执行。但你什么都没做。应该更好地查看文档。“gcmRegID是一个公共变量,现在应该为它分配了GCM值”-不,不应该,因为您的任务是异步运行的,这意味着它不会阻塞,execute()
调用后的行会立即进行。您在哪里调用LogMeIn()
?尝试使用断点。我使用了断点,它不会转到异步任务!!我已经试了三天了,运气不好!!。。为什么它是异步运行的?我在这里做错了什么?我试图将对GCMRegister的调用置于onPreExecute中,但我得到一个错误,它必须在主线程中,就像我在兜圈子一样。。。。调用必须在主线程中,主线程将在函数结束时执行。。。这是没有办法获得GCM代码在中间!!!!好吧,我想我知道你想做什么了。您正在尝试将gcmRegId的值设置为AsyncTask的doInBackground的返回值,对吗?我想获取GCM代码并在公共变量gcmRegId中进行设置