AIn*_*tel 25 java android dagger dagger-2 retrofit2
我想知道Dagger是否有办法知道它应该在新数据可用时重新创建一个对象.
我所说的实例是我用于改造的请求标题.在某些时候(当用户登录时),我得到一个令牌,我需要将其添加到改造的标题中以进行经过身份验证的请求.问题是,我留下了相同的未经验证的改造版本.这是我的注射代码:
@Provides
@Singleton
OkHttpClient provideOkHttpClient(Cache cache) {
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(interceptor)
.cache(cache).build();
client
.newBuilder()
.addInterceptor(
chain -> {
Request original = chain.request();
Request.Builder requestBuilder = original.newBuilder()
.addHeader("Accept", "Application/JSON");
Request request = requestBuilder.build();
return chain.proceed(request);
}).build();
return client;
}
@Provides
@Singleton
Retrofit provideRetrofit(Gson gson, OkHttpClient okHttpClient) {
Retrofit retrofit = new Retrofit.Builder()
.addConverterFactory(GsonConverterFactory.create(gson))
.addCallAdapterFactory(RxErrorHandlingCallAdapterFactory.create())
.baseUrl(mBaseUrl)
.client(okHttpClient)
.build();
return retrofit;
}
@Provides
@Singleton
public NetworkService providesNetworkService(Retrofit retrofit) {
return retrofit.create(NetworkService.class);
}
Run Code Online (Sandbox Code Playgroud)
关于如何使这项工作的任何想法?
old*_*god 37
我个人创建了一个okhttp3.Interceptor为我做的,一旦我有了所需的令牌,我就会更新.它看起来像:
@Singleton
public class MyServiceInterceptor implements Interceptor {
private String sessionToken;
@Inject public MyServiceInterceptor() {
}
public void setSessionToken(String sessionToken) {
this.sessionToken = sessionToken;
}
@Override public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
Request.Builder requestBuilder = request.newBuilder();
if (request.header(NO_AUTH_HEADER_KEY) == null) {
// needs credentials
if (sessionToken == null) {
throw new RuntimeException("Session token should be defined for auth apis");
} else {
requestBuilder.addHeader("Cookie", sessionToken);
}
}
return chain.proceed(requestBuilder.build());
}
}
Run Code Online (Sandbox Code Playgroud)
在相应的匕首组件中,我公开了这个拦截器,以便我可以设置sessionToken我需要的时间.
这是杰克谈到的一些东西,他的演讲让改造为你工作.
azi*_*ian 10
请考虑使用@oldergod提到的方法,因为它是"官方"和更好的方法,而不建议下面提到的方法,它们可能被视为解决方法.
你有几个选择.
Retrofit实例的组件归零,创建新组件并请求新Retrofit实例,该实例将使用必要的okhttp实例进行实例化.SharedPreferences,创建okHttp标头,这将应用令牌读取SharedPreferences.如果没有 - 发送没有令牌标头.static volatile String字段,并像在第2步中那样做.为什么第二种选择不好?因为在每个请求中,您将轮询SD卡并从那里获取数据.
| 归档时间: |
|
| 查看次数: |
9624 次 |
| 最近记录: |