Android: 如何在获取 Google 令牌的异步任务上实现回调?
Android: How to implement callback on async task which fetch Google token?
我正在尝试在我的应用程序上实现 google 登录。我设法登录并存储令牌,但由于任务是异步的,我不知道它何时完成,所以我无法在进一步的方法中安全地使用令牌。如何向 onPostExecute
添加回调方法?
代码如下:
@Override
public void onConnected(Bundle bundle) {
// onConnected indicates that an account was selected on the device, that the selected
// account has granted any requested permissions to our app and that we were able to
// establish a service connection to Google Play services.
Log.d(TAG, "onConnected:" + bundle);
mShouldResolve = false;
mAccountName = Plus.AccountApi.getAccountName(mGoogleApiClient);
//HERE I RETRIEVE THE TOKEN AND NEED TO IMPLEMENT CALLBACK
new RetrieveTokenTask().execute(mAccountName);
// Show the signed-in UI
Intent intent = new Intent(getActivity(), MainActivity.class);
startActivity(intent);
}
@Override
public void onClick(View v) {
if (v.getId() == R.id.sign_in_button) {
onSignInClicked();
}
}
private void onSignInClicked() {
// User clicked the sign-in button, so begin the sign-in process and automatically
// attempt to resolve any errors that occur.
mShouldResolve = true;
mGoogleApiClient.connect();
// Show a message to the user that we are signing in.
//mStatusTextView.setText(R.string.signing_in);
Log.i("GoogleSignIn", "in progress");
}
private class RetrieveTokenTask extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... params) {
String accountName = params[0];
String scopes = "oauth2:profile email";
String token = null;
try {
token = GoogleAuthUtil.getToken(getActivity().getApplicationContext(), accountName, scopes);
} catch (IOException e) {
Log.e(TAG, e.getMessage());
} catch (UserRecoverableAuthException e) {
//startActivityForResult(e.getIntent(), REQ_SIGN_IN_REQUIRED);
} catch (GoogleAuthException e) {
Log.e(TAG, e.getMessage());
}
return token;
}
@Override
protected void onPostExecute(String token) {
super.onPostExecute(token);
Log.i("Token Value: ", token);
//TODO : access token verifier https://developers.google.com/identity/sign-in/android/backend-auth
accessToken = token;
}
}
你可以在 onPostExecute 方法中启动 main activity ..
这样你就可以确定任务已经执行并且即将完成。
检查这个
private class RetrieveTokenTask extends AsyncTask<String, Void, String> {
private Callback callback;
public RetrieveTokenTask(Callback callback){
this.callback = callback;
}
@Override
protected String doInBackground(String... params) {
String accountName = params[0];
String scopes = "oauth2:profile email";
String token = null;
try {
token = GoogleAuthUtil.getToken(getActivity().getApplicationContext(), accountName, scopes);
} catch (IOException e) {
Log.e(TAG, e.getMessage());
} catch (UserRecoverableAuthException e) {
//startActivityForResult(e.getIntent(), REQ_SIGN_IN_REQUIRED);
} catch (GoogleAuthException e) {
Log.e(TAG, e.getMessage());
}
return token;
}
@Override
protected void onPostExecute(String token) {
super.onPostExecute(token);
Log.i("Token Value: ", token);
//TODO : access token verifier https://developers.google.com/identity/sign-in/android/backend-auth
accessToken = token;
callback.done();
}
}
//create an interface
public interface Callback{
//create the callback method
void done();
}
启动任务时,像这样在构造函数中传递回调接口的实例,例如
new RetrieveTokenTask(this).execute(mAccountName);
并使您的 activity 实现回调接口。
例如MainActivity implements Callback
现在 MainActivity 将有一个 done 方法,这个方法就是你的回调。
我希望这个解释对您有所帮助。
不要在 Android 上使用 AsyncTask。这很糟糕,真的很糟糕。您将开始出现内存泄漏,这很糟糕。
这里有更多信息说明为什么 AsyncTask 在 Android 上不好:http://simonvt.net/2014/04/17/asynctask-is-bad-and-you-should-feel-bad/
为了您的网络通话,为什么要重新发明轮子?有许多成熟且经过测试的库可以为您完成所有艰苦的工作,它们甚至可以为您提供回调。
我向您推荐 Square 的 Retrofit,它们为您提供同步调用以及异步(回调)和可观察对象。只需选择您想要的那个,最有可能是带有回调的异步。
我正在尝试在我的应用程序上实现 google 登录。我设法登录并存储令牌,但由于任务是异步的,我不知道它何时完成,所以我无法在进一步的方法中安全地使用令牌。如何向 onPostExecute
添加回调方法?
代码如下:
@Override
public void onConnected(Bundle bundle) {
// onConnected indicates that an account was selected on the device, that the selected
// account has granted any requested permissions to our app and that we were able to
// establish a service connection to Google Play services.
Log.d(TAG, "onConnected:" + bundle);
mShouldResolve = false;
mAccountName = Plus.AccountApi.getAccountName(mGoogleApiClient);
//HERE I RETRIEVE THE TOKEN AND NEED TO IMPLEMENT CALLBACK
new RetrieveTokenTask().execute(mAccountName);
// Show the signed-in UI
Intent intent = new Intent(getActivity(), MainActivity.class);
startActivity(intent);
}
@Override
public void onClick(View v) {
if (v.getId() == R.id.sign_in_button) {
onSignInClicked();
}
}
private void onSignInClicked() {
// User clicked the sign-in button, so begin the sign-in process and automatically
// attempt to resolve any errors that occur.
mShouldResolve = true;
mGoogleApiClient.connect();
// Show a message to the user that we are signing in.
//mStatusTextView.setText(R.string.signing_in);
Log.i("GoogleSignIn", "in progress");
}
private class RetrieveTokenTask extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... params) {
String accountName = params[0];
String scopes = "oauth2:profile email";
String token = null;
try {
token = GoogleAuthUtil.getToken(getActivity().getApplicationContext(), accountName, scopes);
} catch (IOException e) {
Log.e(TAG, e.getMessage());
} catch (UserRecoverableAuthException e) {
//startActivityForResult(e.getIntent(), REQ_SIGN_IN_REQUIRED);
} catch (GoogleAuthException e) {
Log.e(TAG, e.getMessage());
}
return token;
}
@Override
protected void onPostExecute(String token) {
super.onPostExecute(token);
Log.i("Token Value: ", token);
//TODO : access token verifier https://developers.google.com/identity/sign-in/android/backend-auth
accessToken = token;
}
}
你可以在 onPostExecute 方法中启动 main activity .. 这样你就可以确定任务已经执行并且即将完成。
检查这个
private class RetrieveTokenTask extends AsyncTask<String, Void, String> {
private Callback callback;
public RetrieveTokenTask(Callback callback){
this.callback = callback;
}
@Override
protected String doInBackground(String... params) {
String accountName = params[0];
String scopes = "oauth2:profile email";
String token = null;
try {
token = GoogleAuthUtil.getToken(getActivity().getApplicationContext(), accountName, scopes);
} catch (IOException e) {
Log.e(TAG, e.getMessage());
} catch (UserRecoverableAuthException e) {
//startActivityForResult(e.getIntent(), REQ_SIGN_IN_REQUIRED);
} catch (GoogleAuthException e) {
Log.e(TAG, e.getMessage());
}
return token;
}
@Override
protected void onPostExecute(String token) {
super.onPostExecute(token);
Log.i("Token Value: ", token);
//TODO : access token verifier https://developers.google.com/identity/sign-in/android/backend-auth
accessToken = token;
callback.done();
}
}
//create an interface
public interface Callback{
//create the callback method
void done();
}
启动任务时,像这样在构造函数中传递回调接口的实例,例如
new RetrieveTokenTask(this).execute(mAccountName);
并使您的 activity 实现回调接口。
例如MainActivity implements Callback
现在 MainActivity 将有一个 done 方法,这个方法就是你的回调。
我希望这个解释对您有所帮助。
不要在 Android 上使用 AsyncTask。这很糟糕,真的很糟糕。您将开始出现内存泄漏,这很糟糕。
这里有更多信息说明为什么 AsyncTask 在 Android 上不好:http://simonvt.net/2014/04/17/asynctask-is-bad-and-you-should-feel-bad/
为了您的网络通话,为什么要重新发明轮子?有许多成熟且经过测试的库可以为您完成所有艰苦的工作,它们甚至可以为您提供回调。
我向您推荐 Square 的 Retrofit,它们为您提供同步调用以及异步(回调)和可观察对象。只需选择您想要的那个,最有可能是带有回调的异步。