AsyncTask
が正しく動作するように問題が発生しました。 My Appは、あなたのGoogleアカウントに接続し、Tasks APIを使用してタスクを追加および受信する可能性を提供します。ユーザーが自分のアカウントと同期したい場合、doInBackground()
メソッドが開始されます。その直前にProgressDialog
がAsyncTask
クラスの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);
}
を私はあなたの助け
AsyncTaskの実装、または実行している場所が多忙な場合は、さらに情報を投稿してください。 – HandlerExploit
私が推測しなければならないと、 'doInBackground()'は非同期作業を開始して戻ります。 – CommonsWare
答えをありがとう、私は不足しているコードを追加 – vein