AsyncTask - 在doInBackground之前调用onPostExecute

时间:2012-01-27 21:08:32

标签: android android-asynctask google-tasks-api

我遇到问题让AsyncTask工作正常。我的应用程序可以使用Tasks API连接您的Google帐户并添加和接收任务。当用户想要与其帐户同步时,将启动doInBackground()方法。在此之前,ProgressDialog类的onPreExecute()方法中会显示AsyncTask。 如果已成功执行同步,则应调用onPostExecute()方法'淡出ProgressDialog
但是存在问题:在onPostExecute()中的工作完成之前调用doInBackground()方法。 在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();
          }

      }
}

这里是我的startSynchronize()和synchronize()方法:

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();

感谢大家的帮助

1 个答案:

答案 0 :(得分:3)

如果我不误解您的问题,那么您使用getResult()方法就错了。

当代码中的任何地方调用getResult()时,AsyncTask不会等到完成。所以你需要用onPostExecute方法完成你的过程。

我建议您question&answer。我希望,它会帮助你。