从Android Application类刷新Dagger 2实例
问题内容:
我的模块类中有一组@Singleton
and
@Provides
方法,目的是在整个应用程序中创建Singleton实例。一切工作正常,除了少数瓶颈情况,如下所示:
步骤1.我正在OKHttpClient
使用其中的Auth令牌创建一个Retrofit实例,以每次进行经过身份验证的api调用(通过来处理Auth令牌的检索和插入SharedPreferences
)。但是问题出在我通过清除数据库和共享的首选项值注销应用程序后重新启动活动时。
步骤2。注销后,正在提出另一个请求以获取身份验证令牌并SharedPreferences
再次插入以供将来使用。
步骤3:现在,如果我继续进行其余的api调用,除非并且直到我通过从近期任务中清除应用程序来重新启动该应用程序,否则Dagger
@Singleton
和@Provides
方法的先前实例仍保持不变。(新的身份验证令牌未更新)
所需的修复程序:
-
如何强制触发Dagger提供程序方法以再次触发或吊销它?
-
是否有任何方法可以像重新启动应用程序时一样刷新应用程序类数据?
请找到我的项目中使用的Dagger 2架构:
NetworkModule.java (Dagger模块类)
@Module
public class NetworkModule {
private Context context;
public NetworkModule(Application app) {
this.context = app;
}
@Provides
@Named("network.context")
Context providesContext() {
return context;
}
@Singleton
@Provides
OkHttpClient providesOkHttpClient(@Named("network.context")final Context context) {
final UserProfile userProfile = GsonUtils.createPojo(SharedPrefsUtils.getString(Constants.SHARED_PREFS.USERS_PROFILE, "",context), UserProfile.class);
Logger.i(userProfile != null && !TextUtils.isEmpty(userProfile.getAuth_token()) ? userProfile.getAuth_token() : "----OAuth token empty---");
OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
httpClient.addInterceptor(new Interceptor() {
@Override
public Response intercept(Interceptor.Chain chain) throws IOException {
Request original = chain.request();
Request request = original.newBuilder()
.header("Accept", "application/json")
.header("Content-Type", "application/json")
.header("Api-Version", "application/vnd.addo-v1+json")
.header("Access-Token", userProfile != null && !TextUtils.isEmpty(userProfile.getAuth_token()) ? userProfile.getAuth_token() : "")
.header("App-Version", Utils.getVersionName(context))
.header("Device-Platform","android")
.method(original.method(), original.body())
.build();
return chain.proceed(request);
}
});
return httpClient.build();
}
@Provides
@Named(Constants.INJECTION.BASE_URL)
String providebaseURL() {
return Constants.URL.BASE_URL;
}
@Singleton
@Provides
Retrofit providesRetrofit(@Named("network.context")Context context, @Named(Constants.INJECTION.BASE_URL) String baseURL, OkHttpClient okHttpClient) {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(baseURL)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.client(okHttpClient)
.build();
return retrofit;
}
@Singleton
@Provides
NetworkApiService providesNetworkApiService(Retrofit retrofit){
return retrofit.create(NetworkApiService.class);
}
@Singleton
@Provides
ProjectPresenter providesProjectPresenter(NetworkApiService networkApiService){
return new ProjectPresenterImpl(networkApiService);
}
}
AppComponent.java (Dagger组件类)
@Singleton
@Component(modules = {NetworkModule.class})
public interface AppComponent {
//ACtivity
void inject(AuthenticationActivity authenticationActivity);
void inject(MainActivity mainActivity);
//Fragments
void inject(ProjectsListFragment projectsListFragment);
}
Application.java (用于创建Dagger组件的类)
public class Application extends Application {
private AppComponent appComponent ;
@Override
public void onCreate() {
super.onCreate();
Realm.init(this);
ButterKnife.setDebug(BuildConfig.DEBUG);
appComponent = DaggerAppComponent.builder().appModule(new AppModule(this)).networkModule(new NetworkModule(this)).build();
}
public AppComponent getAppComponent() {
return appComponent;
}
}
请帮助我解决Dagger
2怪异行为的建议或技巧,因为过去6天我完全坚持了这一点,所以任何一种解决方案都对我有很大帮助。我无能为力和困惑,因为我的完整架构是建立在此之上的。请原谅我的错别字和更正。如果有需要澄清的地方,请联系我。提前致谢。
问题答案:
如何强制触发Dagger提供程序方法以再次触发或吊销它?
是否有任何方法可以像重新启动应用程序一样刷新应用程序类数据?
不,没有这样的触发条件。Component
负责为您提供依赖关系。如果您已经完成了一个操作,Component
并且想要使它无效(即再次创建依赖项),则必须从中删除(清空)并创建一个新对象Component
。现在,将再次创建所有依赖项。