0

我在让我AsyncTask的工作正常时遇到了问题。我的应用程序提供了与您的 Google 帐户连接并使用 Tasks API 添加和接收任务的可能性。当用户想要与他的帐户同步时,该doInBackground()方法被启动。在此之前, aProgressDialog显示在类的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();

谢谢大家的帮助

4

1 回答 1

3

如果我没有误解您的问题,那么您对getResult()方法的使用有误。

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

我向您推荐这个问题和答案。我希望,它会帮助你。

于 2012-01-27T21:31:11.193 回答