轮不到使用的AccountManager现有令牌在拦截器改造2.0
问题描述:
一,
当我的应用程序启动在MainActivity,有没有在这个时候任何标记,因此未能在的AccountManager找到令牌如此这般谈到美国进入LoginActivity。轮不到使用的AccountManager现有令牌在拦截器改造2.0
二,
我们输入的账号和密码从远程服务器获取令牌,并将其保存在本地AccountManager.then回归MainActivity。
三,
当再回来MainActivity。即使它现在实际存在,我也无法获得本地令牌。所以应用程序将再次进入LoginActivity。如果我现在退出应用程序并再次启动它,Mainactivity现在可以获取现有令牌。
代码
我以这种方式添加令牌插入报头中改造2.0的拦截器:
private volatile static Retrofit jsonInstance;
// Returns singleton class instance
public static Retrofit getJsonInstance(final Context context) {
if (jsonInstance == null) {
synchronized (Retrofit.class) {
if (jsonInstance == null) {
OkHttpClient client = new OkHttpClient();
client.interceptors().add(new Interceptor() {
@Override
public com.squareup.okhttp.Response intercept(Chain chain) throws IOException {
Request request = chain.request();
GitHubAccount gitHubAccount = GitHubAccount.getInstance(context);
//Get token here
token = gitHubAccount.getAuthToken();
request = request.newBuilder()
.removeHeader("User-Agent")
.addHeader("Authorization", "Token " + token)
.addHeader("User-Agent", "Leaking/1.0")
//.addHeader("Accept", "application/vnd.github.beta+json")
.addHeader("Accept", "application/vnd.github.v3.raw")
.build();
return chain.proceed(request);
}
});
Gson gson = new Gson();
GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(Event.class, new EventFormatter());
gson = builder.create();
jsonInstance = new Retrofit.Builder()
.baseUrl(Constants.BASE_URL)
.addConverterFactory(GsonConverterFactory.create(gson))
.client(client)
.build();
}
}
}
return jsonInstance;
}
的getAuthToken()方法
public String getAuthToken() {
final AccountManagerFuture<Bundle> future = manager.getAuthToken(account, ACCOUNT_TYPE, null, (BaseActivity)context, null, null);
try {
Bundle result = future.getResult();
return result.getString(AccountManager.KEY_AUTHTOKEN);
} catch (AccountsException e) {
Log.e(TAG, "Auth token lookup failed", e);
return null;
} catch (IOException e) {
Log.e(TAG, "Auth token lookup failed", e);
return null;
}
}
然后的manager.getAuthToken
将程序发生在我的定制AccountAuthenticator
@Override
public Bundle getAuthToken(AccountAuthenticatorResponse response, Account account, String authTokenType, Bundle options) throws NetworkErrorException {
final AccountManager am = AccountManager.get(context);
String authToken = am.peekAuthToken(account, authTokenType);
if (TextUtils.isEmpty(authToken)) {
final String password = am.getPassword(account);
if (password != null) {
Github github = new GithubImpl(context);
try {
//Get token from server
authToken = github.createToken(account.name,password);
} catch (GithubError githubError) {
githubError.printStackTrace();
authToken = "";
} catch (AuthError authError) {
authError.printStackTrace();
authToken = "";
} catch (OverAuthError overAuthError) {
overAuthError.printStackTrace();
authToken = "";
}
}else {
Log.i(TAG, "Try to get AuthToken password is empty");
}
}
if (!TextUtils.isEmpty(authToken)) {
final Bundle result = new Bundle();
result.putString(AccountManager.KEY_ACCOUNT_NAME, account.name);
result.putString(AccountManager.KEY_ACCOUNT_TYPE, account.type);
result.putString(AccountManager.KEY_AUTHTOKEN, authToken);
return result;
}
// If we get here, then we couldn't access the user's password - so we
// need to re-prompt them for their credentials. We do that by creating
// an intent to display our AuthenticatorActivity.
final Intent intent = new Intent(context, LoginActivity.class);
intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, response);
intent.putExtra(ARG_ACCOUNT_TYPE, account.type);
intent.putExtra(ARG_AUTH_TYPE, authTokenType);
final Bundle bundle = new Bundle();
bundle.putParcelable(AccountManager.KEY_INTENT, intent);
return bundle;
}
项目
答
也许问题是,你要保存令牌的异步处理和保存方法比Get方法慢。