2012-01-27 46 views
0

我遇到問題,我的AsyncTask正常工作。我的應用程序提供了連接您的Google帳戶並通過使用任務API添加和接收任務的可能性。當用戶想要與他的帳戶同步時,將啓動doInBackground()方法。在此之前,ProgressDialog顯示在AsyncTask類的onPreExecute()方法中。
如果同步已成功執行,則應將onPostExecute()方法稱爲淡出ProgressDialog
但有問題:在doInBackground()工作完成之前調用onPostExecute()方法。 在doInBackground()我收到用於授權令牌:AsynTask - onPostExecute在doInBackground之前調用

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

這就是全部。但在此之前,被調用,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()和同步()方法:

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


} 

在Optionsmenu我象這樣開始

new SynchronizeGoogle().execute(); 

感謝大家對你的幫助

+0

請發佈更多信息,您的AsyncTask實現或您正在執行的地方將是足智多謀的。 – HandlerExploit 2012-01-27 21:13:44

+1

如果我不得不猜測,'doInBackground()'正在開始異步工作並返回。 – CommonsWare 2012-01-27 21:22:13

+0

感謝您的答案,我添加了缺少的代碼 – vein 2012-01-27 22:03:30

回答

3

如果我沒有誤解你的問題,那麼你的方法用法錯誤getResult()

當代碼中的任何地方調用getResult()時,AsyncTask不會等到完成。因此,您需要在onPostExecute方法中執行您的過程。

我推薦你這個question&answer。我希望,它會幫助你。

相關問題