我想知道 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);
}
关于如何使这项工作有任何想法吗?
原文由 AIntel 发布,翻译遵循 CC BY-SA 4.0 许可协议
请考虑使用 @oldergod 提到 的方法,因为它是 “官方” 且更好的方法, 而不 建议使用下面提到的方法,它们可能被视为解决方法。
你有几个选择。
Retrofit
实例的组件,创建一个新组件并请求一个新的Retrofit
实例,该实例将被实例化具有必要的okhttp
实例。SharedPreferences
中,创建okHttp
标头,这将应用从SharedPreferences
读取的令牌。如果没有 - 不发送令牌标头。static volatile String
字段,然后执行与步骤 2 中相同的操作。为什么第二种选择不好?因为在每次请求时,您都会轮询磁盘并从那里获取数据。