Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/206.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
Android AsynTask-onPostExecute在doInBackground之前调用_Android_Android Asynctask_Google Tasks Api - Fatal编程技术网

Android AsynTask-onPostExecute在doInBackground之前调用

Android AsynTask-onPostExecute在doInBackground之前调用,android,android-asynctask,google-tasks-api,Android,Android Asynctask,Google Tasks Api,我的AsyncTask无法正常工作。我的应用程序提供了使用tasks API连接您的Google帐户并添加和接收任务的可能性。当用户希望与其帐户同步时,将启动doInBackground()方法。在此之前,AsyncTask类的onPreExecute()方法中会显示一个ProgressDialog。 如果同步已成功执行,则应调用onPostExecute()方法“淡出ProgressDialog 但是有一个问题:在doInBackground()中的工作完成之前调用了onPostExecute

我的
AsyncTask
无法正常工作。我的应用程序提供了使用tasks API连接您的Google帐户并添加和接收任务的可能性。当用户希望与其帐户同步时,将启动
doInBackground()
方法。在此之前,
AsyncTask
类的
onPreExecute()
方法中会显示一个
ProgressDialog

如果同步已成功执行,则应调用
onPostExecute()
方法“淡出
ProgressDialog

但是有一个问题:在
doInBackground()
中的工作完成之前调用了
onPostExecute()
方法。 在
doInBackground()
中,我收到用于授权的令牌:

token = future.getResult().getString(AccountManager.KEY_AUTHTOKEN);
就这些。但是就在这之前,调用了
onPostExecute()
,并且
ProgressDialog
在令牌仍在检索时消失。有线的事情是,当我第一次启动应用程序并进行同步时,它会正常工作。但是在此之后,
onPostExecute()
方法在工作完成之前完成。执行时是否必须有对服务器的请求

future.getResult().getString(AccountManager.KEY_AUTHTOKEN);
如何告诉
onPostExecute()
方法还有工作要做

private class SynchronizeGoogle extends AsyncTask<Void, Integer, Void> 
    {
    private final ProgressDialog dialog = new ProgressDialog(RememberMe.this);
    protected void onPreExecute() 
    {
        this.dialog.setMessage("Listen werden geladen...");
        this.dialog.show();
     }

    @Override
    protected Void doInBackground(Void... arg0) 
    {
        try 
            {
            switch(startSynchronize())
                {
                    case 0: 
                        publishProgress(0);
                        return null;
                    case 1: 
                        publishProgress(1);
                        return null;
                    case 2: 
                        publishProgress(2);
                        return null;
                }
            } 
        catch (IOException e) 
            {
                e.printStackTrace();
            }

                    synchronize();


        return null;
    }

    protected void onProgressUpdate(Integer... type)
    {
        int typeCase = type[0];
        switch(typeCase)
        {
            case 0:
                showDialog(DIALOG_INTERNET_ACCESS);
                break;
            case 1:
                showDialog(DIALOG_CREATE_ACCOUNT);
                break;
            case 2:
                showDialog(DIALOG_ACCOUNTS);
                break;

        }


    }

      protected void onPostExecute(final Void unused) 
      {


          if (this.dialog.isShowing()) 
          {
             this.dialog.dismiss();
          }

      }
}

谢谢大家的帮助

如果我没有误解您的问题,您的
getResult()
方法用法是错误的

当代码中的任意位置调用
getResult()
时,AsyncTask不会等到完成。因此,您需要在
onPostExecute
方法中执行流程


我向你推荐这个。我希望,这会对您有所帮助。

如果我没有误解您的问题,您在
getResult()
方法用法上是错误的

当代码中的任意位置调用
getResult()
时,AsyncTask不会等到完成。因此,您需要在
onPostExecute
方法中执行流程


我向你推荐这个。我希望,这会对您有所帮助。

请发布更多信息,您的AsyncTask实现或执行位置将非常有用。如果我不得不猜测,
doInBackground()
正在启动异步工作并返回。感谢您的回答,我添加了缺少的代码请发布更多信息,您的AsyncTask实现或执行它的位置将非常有用。如果我不得不猜测,
doInBackground()
正在启动异步工作并返回。感谢您的回答,我添加了缺少的代码
private int startSynchronize() throws IOException
{
            googleAccountManager = new GoogleAccountManager(RememberMe.this);
    Account[] accounts = googleAccountManager.getAccounts();

    if(checkAccess.internetAccess() == false)
    {
        return 0;
    }
    if(accounts.length == 0)
        {
            return 1;
        }
    else
        {
            if(accounts.length == 1)
            {
                account = accounts[0];

            }
            else
            {
                return 2;
            }
        }

    return -1;
}   

private void synchronize()
{       
myPrefs = this.getSharedPreferences("myPrefs", MODE_PRIVATE);

String oldToken = myPrefs.getString(MY_TOKEN, "");

    if(oldToken.length() > 0)
        {
                            // invalidate old token to be able to receive a new one
            googleAccountManager.invalidateAuthToken(oldToken); 

        }

    googleAccountManager.manager.getAuthToken(account, AUTH_TOKEN_TYPE, true, new AccountManagerCallback<Bundle>() 
            {
            public void run(AccountManagerFuture<Bundle> future) 
                    {
                        try 
                            {

                        token = future.getResult().getString(AccountManager.KEY_AUTHTOKEN);

                                         prefsEditor.putString(MY_TOKEN, token);
                                prefsEditor.commit();

                    useTasksAPI(token);

                            } 
                    catch (OperationCanceledException e) 
                            {
                            //...
                            } 
                    catch (Exception e) 
                            {
                            //...
                            }
                    }
          }, null);


}
new SynchronizeGoogle().execute();