내 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);
}
내가 당신의 도움이
new SynchronizeGoogle().execute();
감사합니다 모든 사람처럼 시작
AsyncTask 구현이나 실행중인 곳에서 자세한 정보를 게시하십시오. – HandlerExploit
내가 추측해야만한다면,'doInBackground()'가 비동기 작업을 시작하고 돌아오고 있습니다. – CommonsWare
답변을 주셔서 감사합니다. 누락 된 코드를 추가했습니다. – vein