我遇到問題,我的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();
感謝大家對你的幫助
請發佈更多信息,您的AsyncTask實現或您正在執行的地方將是足智多謀的。 – HandlerExploit 2012-01-27 21:13:44
如果我不得不猜測,'doInBackground()'正在開始異步工作並返回。 – CommonsWare 2012-01-27 21:22:13
感謝您的答案,我添加了缺少的代碼 – vein 2012-01-27 22:03:30