2012-01-27 6 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); 


} 

내가 당신의 도움이

new SynchronizeGoogle().execute(); 

감사합니다 모든 사람처럼 시작

+0

AsyncTask 구현이나 실행중인 곳에서 자세한 정보를 게시하십시오. – HandlerExploit

+1

내가 추측해야만한다면,'doInBackground()'가 비동기 작업을 시작하고 돌아오고 있습니다. – CommonsWare

+0

답변을 주셔서 감사합니다. 누락 된 코드를 추가했습니다. – vein

답변

3

질문에 대한 오해가 없다면 getResult() 메서드 사용에 문제가있는 것입니다.

getResult() 코드에서 아무 데나 호출하면 AsyncTask가 완료 될 때까지 기다리지 않습니다. 따라서 onPostExecute 방법으로 프로세스를 수행해야합니다.

나는 당신을 추천한다 question&answer. 나는 너를 도울거야.