2012-01-27 8 views
0

AsyncTaskが正しく動作するように問題が発生しました。 My Appは、あなたのGoogleアカウントに接続し、Tasks APIを使用してタスクを追加および受信する可能性を提供します。ユーザーが自分のアカウントと同期したい場合、doInBackground()メソッドが開始されます。その直前にProgressDialogAsyncTaskクラスのonPreExecute()メソッドに表示されます。
同期が正常に実行された場合は、ProgressDialogをフェードアウトする必要があります。onPostExecute()
しかし、問題があります:doInBackground()の作業が終了する前にonPostExecute()エコーが呼び出されています。AsynTask - onPostExecuteはdoInBackgroundの前に呼び出されます

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

すべてです:doInBackground()で 私は、認可のために使用されるトークンを受け取ります。しかしその直前に、トークンがまだ取り出されている間にが呼び出され、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()と()メソッド同期:Optionsmenuで

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


} 

を私はあなたの助け

+0

AsyncTaskの実装、または実行している場所が多忙な場合は、さらに情報を投稿してください。 – HandlerExploit

+1

私が推測しなければならないと、 'doInBackground()'は非同期作業を開始して戻ります。 – CommonsWare

+0

答えをありがとう、私は不足しているコードを追加 – vein

答えて

3

ため、この

new SynchronizeGoogle().execute(); 

おかげで皆のようにそれを開始あなたの質問を誤解していない場合は、getResult()メソッドの使い方が間違っています。

getResult()がコード内のどこでも呼び出されると、AsyncTaskは終了するまで待機しません。だから、onPostExecuteの方法であなたのプロセスを行う必要があります。

私はこれをお勧めしますquestion&answer。私は、それがあなたを助けることを願っています。

関連する問題