轮不到使用的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; 
} 

项目

项目总在这里 https://github.com/Leaking/WeGit

也许问题是,你要保存令牌的异步处理和保存方法比Get方法慢。