Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java AsyncTask在函数末尾执行_Java_Android_Android Studio_Android Asynctask_Google Cloud Messaging - Fatal编程技术网

Java 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

我正在使用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;
}
这是等待执行到结束的异步任务

//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(结果)
这些可以添加到您的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");
}

尝试放置新的
GCM().execute(null,null,null)在受保护的void
onCreate(Bundle savedInstanceState)
方法中。这样,一旦应用程序运行,它就会被调用。这样,在使用
LogMEIn
方法之前,您将拥有
GCM
id。

AsyncTask保留一个任务队列和一个线程池,线程池逐个执行任务,因此如果任务太多,您将发现它不会立即执行任务


在一个进程中,所有AsyncTask共享一个线程池。在这种情况下,您应该自己创建一个任务队列,您可以使用HandletThread及时执行任务。

它会立即执行。但你什么都没做。应该更好地查看文档。“gcmRegID是一个公共变量,现在应该为它分配了GCM值”-不,不应该,因为您的任务是异步运行的,这意味着它不会阻塞,
execute()
调用后的行会立即进行。您在哪里调用
LogMeIn()
?尝试使用断点。我使用了断点,它不会转到异步任务!!我已经试了三天了,运气不好!!。。为什么它是异步运行的?我在这里做错了什么?我试图将对GCMRegister的调用置于onPreExecute中,但我得到一个错误,它必须在主线程中,就像我在兜圈子一样。。。。调用必须在主线程中,主线程将在函数结束时执行。。。这是没有办法获得GCM代码在中间!!!!好吧,我想我知道你想做什么了。您正在尝试将gcmRegId的值设置为AsyncTask的doInBackground的返回值,对吗?我想获取GCM代码并在公共变量gcmRegId中进行设置