0

私はAsyncTask正しく動作させるのに問題がありました。My App は、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 に答える