Способ AsyncTask Android OAuth2Client
Я пытаюсь использовать этот код:
public static Token getAccessToken(OAuth2Config oauthDetails) {
HttpPost post = new HttpPost(oauthDetails.getTokenEndPointUrl());
String clientId = oauthDetails.getClientId();
String clientSecret = oauthDetails.getClientSecret();
String scope = oauthDetails.getScope();
List<BasicNameValuePair> parametersBody = new ArrayList<BasicNameValuePair>();
parametersBody.add(new BasicNameValuePair(OAuthConstants.GRANT_TYPE,
oauthDetails.getGrantType()));
parametersBody.add(new BasicNameValuePair(OAuthConstants.USERNAME,
oauthDetails.getUsername()));
parametersBody.add(new BasicNameValuePair(OAuthConstants.PASSWORD,
oauthDetails.getPassword()));
if (isValid(clientId)) {
parametersBody.add(new BasicNameValuePair(OAuthConstants.CLIENT_ID,
clientId));
}
if (isValid(clientSecret)) {
parametersBody.add(new BasicNameValuePair(
OAuthConstants.CLIENT_SECRET, clientSecret));
}
if (isValid(scope)) {
parametersBody.add(new BasicNameValuePair(OAuthConstants.SCOPE,
scope));
}
DefaultHttpClient client = new DefaultHttpClient();
HttpResponse response = null;
Token accessToken = null;
try {
post.setEntity(new UrlEncodedFormEntity(parametersBody, HTTP.UTF_8));
response = client.execute(post);
int code = response.getStatusLine().getStatusCode();
if (code >= 400) {
Log.d(TAG, "Authorization server expects Basic authentication");
// Add Basic Authorization header
post.addHeader(
OAuthConstants.AUTHORIZATION,
getBasicAuthorizationHeader(oauthDetails.getUsername(),
oauthDetails.getPassword()));
Log.d(TAG, "Retry with login credentials");
try {
response.getEntity().consumeContent();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
response = client.execute(post);
code = response.getStatusLine().getStatusCode();
if (code >= 400) {
Log.d(TAG, "Retry with client credentials");
post.removeHeaders(OAuthConstants.AUTHORIZATION);
post.addHeader(
OAuthConstants.AUTHORIZATION,
getBasicAuthorizationHeader(
oauthDetails.getClientId(),
oauthDetails.getClientSecret()));
try {
response.getEntity().consumeContent();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
response = client.execute(post);
code = response.getStatusLine().getStatusCode();
if (code >= 400) {
throw new RuntimeException(
"Could not retrieve access token for user: "
+ oauthDetails.getUsername());
}
}
}
Map map = handleResponse(response);
accessToken = new Token(Long.valueOf((Integer) map.get(OAuthConstants.EXPIRES_IN)), (String) map.get(OAuthConstants.TOKEN_TYPE), (String) map.get(OAuthConstants.REFRESH_TOKEN), (String) map.get(OAuthConstants.ACCESS_TOKEN));
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return accessToken;
}
Является частью OAuth2Client, который я использую в своем приложении для Android. Я получаю эту ошибку:
android.os.NetworkOnMainThreadException
и я читал, что я должен использовать AsyncTask, но я не знаю, как преобразовать этот метод в AsyncTask.
Я буду признателен за некоторую помощь.
Спасибо
1 ответ
Решение
Прежде всего вам нужен фрагмент, чтобы обернуть asynctask
поэтому, если устройство вращается, вы не создаете несколько запросов и не пропускаете их. А также тебе нужен слушатель (GetAccessTokenCallbacks
) сообщать о своей деятельности, которую вы сделали, и возвращать результат.
public class GetAccessTokenFragment extends Fragment {
OAuth2Config mOauthDetails;
static interface GetAccessTokenCallbacks {
void onPostExecute(Token token);
}
private GetAccessTokenCallbacks mCallbacks;
private AccessTokenTask mTask;
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
mCallbacks = (GetAccessTokenCallbacks) activity;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
// you must do it as follow
// first create new instance
// mOauthDetails = new OAuth2Config(....)
// then use the values of MainActivity.this.mOauthDetails to initialize it
mTask = new AccessTokenTask();
mTask.execute();
}
@Override
public void onDetach() {
super.onDetach();
mCallbacks = null;
}
private class AccessTokenTask extends AsyncTask<Void, Void, Token> {
@Override
protected Token doInBackground(Void... param) {
Token token = TheClassOfThisFunction.getAccessToken(mOauthDetails);
return token;
}
@Override
protected void onPostExecute(Token token) {
if (mCallbacks != null) {
mCallbacks.onPostExecute(token[0]);
}
}
}
}
и в вашем MainActivity
Вы должны реализовать GetAccessTokenFragment.GetAccessTokenCallbacks
и создание GetAccessTokenFragment
,
public class MainActivity extends FragmentActivity implements GetAccessTokenFragment.GetAccessTokenCallbacks {
public OAuth2Config mOauthDetails;
private static final String TAG_GetAccessTokenFragment = "GetAccessToken";
private GetAccessTokenFragment mGetAccessTokenFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Initialize mOauthDetails here
FragmentManager fm = getSupportFragmentManager();
mGetAccessTokenFragment = (GetAccessTokenFragment) fm.findFragmentByTag(TAG_GetAccessTokenFragment);
if (mGetAccessTokenFragment == null) {
mGetAccessTokenFragment = new GetAccessTokenFragment();
fm.beginTransaction().add(mGetAccessTokenFragment, TAG_GetAccessTokenFragment).commit();
}
}
@Override
public void onPostExecute(Token token) {
//you got your token here
}
}
Кажется, что OAuthConfig вызывается в следующем:
public class OAuth2Client {
private final String username;
private final String password;
private final String clientId;
private final String clientSecret;
private final String site;
public OAuth2Client(String username, String password, String clientId, String clientSecret, String site) {
this.username = username;
this.password = password;
this.clientId = clientId;
this.clientSecret = clientSecret;
this.site = site;
}
public String getUsername() {
return username;
}
public String getPassword() {
return password;
}
public String getClientId() {
return clientId;
}
public String getClientSecret() {
return clientSecret;
}
public String getSite() {
return site;
}
public Token getAccessToken() {
OAuth2Config oauthConfig = new OAuth2Config.OAuth2ConfigBuilder(username, password, clientId, clientSecret, site)
.grantType("password").build();
return OAuthUtils.getAccessToken(oauthConfig);
}
}