AsyncTask在函数

时间:2016-06-07 12:22:32

标签: java android android-studio android-asynctask google-cloud-messaging

我正在使用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

由于

4 个答案:

答案 0 :(得分:2)

如果没有看到更多的代码,我很难说,但我会看看你在哪里调用LogMeIn()。因为AsyncTask和execute to 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");
}

答案 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来执行及时的任务。