Android AsynTask-onPostExecute在doInBackground之前调用
我的Android AsynTask-onPostExecute在doInBackground之前调用,android,android-asynctask,google-tasks-api,Android,Android Asynctask,Google Tasks Api,我的AsyncTask无法正常工作。我的应用程序提供了使用tasks API连接您的Google帐户并添加和接收任务的可能性。当用户希望与其帐户同步时,将启动doInBackground()方法。在此之前,AsyncTask类的onPreExecute()方法中会显示一个ProgressDialog。 如果同步已成功执行,则应调用onPostExecute()方法“淡出ProgressDialog 但是有一个问题:在doInBackground()中的工作完成之前调用了onPostExecute
AsyncTask
无法正常工作。我的应用程序提供了使用tasks API连接您的Google帐户并添加和接收任务的可能性。当用户希望与其帐户同步时,将启动doInBackground()
方法。在此之前,AsyncTask
类的onPreExecute()
方法中会显示一个ProgressDialog
。如果同步已成功执行,则应调用
onPostExecute()
方法“淡出ProgressDialog
但是有一个问题:在
doInBackground()
中的工作完成之前调用了onPostExecute()
方法。
在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();
}
}
}
谢谢大家的帮助如果我没有误解您的问题,您的
getResult()
方法用法是错误的
当代码中的任意位置调用getResult()
时,AsyncTask不会等到完成。因此,您需要在onPostExecute
方法中执行流程
我向你推荐这个。我希望,这会对您有所帮助。如果我没有误解您的问题,您在
getResult()
方法用法上是错误的
当代码中的任意位置调用getResult()
时,AsyncTask不会等到完成。因此,您需要在onPostExecute
方法中执行流程
我向你推荐这个。我希望,这会对您有所帮助。请发布更多信息,您的AsyncTask实现或执行位置将非常有用。如果我不得不猜测,
doInBackground()
正在启动异步工作并返回。感谢您的回答,我添加了缺少的代码请发布更多信息,您的AsyncTask实现或执行它的位置将非常有用。如果我不得不猜测,doInBackground()
正在启动异步工作并返回。感谢您的回答,我添加了缺少的代码
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();