当前位置: 首页 > 面试题库 >

从Android Application类刷新Dagger 2实例

寿丰
2023-03-14
问题内容

我的模块类中有一组@Singletonand
@Provides方法,目的是在整个应用程序中创建Singleton实例。一切工作正常,除了少数瓶颈情况,如下所示:

步骤1.我正在OKHttpClient使用其中的Auth令牌创建一个Retrofit实例,以每次进行经过身份验证的api调用(通过来处理Auth令牌的检索和插入SharedPreferences)。但是问题出在我通过清除数据库和共享的首选项值注销应用程序后重新启动活动时。

步骤2。注销后,正在提出另一个请求以获取身份验证令牌并SharedPreferences再次插入以供将来使用。

步骤3:现在,如果我继续进行其余的api调用,除非并且直到我通过从近期任务中清除应用程序来重新启动该应用程序,否则Dagger
@Singleton@Provides方法的先前实例仍保持不变。(新的身份验证令牌未更新)

所需的修复程序:

  1. 如何强制触发Dagger提供程序方法以再次触发或吊销它?

  2. 是否有任何方法可以像重新启动应用程序时一样刷新应用程序类数据?

请找到我的项目中使用的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。现在,将再次创建所有依赖项。



 类似资料:
  • 问题内容: 如果将新文档索引到Elasticsearch索引,则可在索引操作后1秒钟左右搜索新文档。但是,可以通过调用或对索引进行操作来强制使该文档可立即搜索。这两个操作之间有什么区别- 结果似乎对他们来说是相同的,可以立即搜索文档。 这些操作中的每一项到底是什么? ES文档似乎并未深入解决此问题。 问题答案: 您得到的答案是正确的,但我认为值得详细说明。 刷新有效地调用了Lucene索引读取器上

  • 问题内容: 我希望能够通过在已实例化的对象上调用方法来创建对象的新实例。例如,我有一个对象: 我希望能够调用并拥有两个有机体类型的对象。此时我的方法如下所示: 并且我非常确定它不起作用(我甚至不确定如何测试它。我在本文中尝试了gc方法)。那么,如何使我的对象创建自己的副本,就像我创建的第一个对象(带有)一样,该副本是可访问的? 问题答案: 另一个选项-如果方法中未使用实例(): 这样可以确保生物产

  • 请求你分享你的想法。 提前道谢。

  • 2.12 刷新 2.12.1 描述 此接口用于增加内容刷新任务 2.12.2 请求地址 地址: https://api.bokecs.com/cont/add_refresh 2.12.3 请求方式 POST 2.12.4 请求参数 1) 请求入参 Urls 待刷新的链接 2)请求出参 { "code": "", "message": "" } code:接口响应代码。200表示成功。 mess

  • 本文向大家介绍Vue 实现前进刷新后退不刷新的效果,包括了Vue 实现前进刷新后退不刷新的效果的使用技巧和注意事项,需要的朋友参考一下 需求一: 在一个列表页中,第一次进入的时候,请求获取数据。 点击某个列表项,跳到详情页,再从详情页后退回到列表页时,不刷新。 也就是说从其他页面进到列表页,需要刷新获取数据,从详情页返回到列表页时不要刷新。 解决方案在 app.vue 设置: 假设列表页为 lis

  • 本文向大家介绍python Tkinter的图片刷新实例,包括了python Tkinter的图片刷新实例的使用技巧和注意事项,需要的朋友参考一下 调用python自带的GUI制作库 一开始想用Tkinter制作GUI的,网上说是python自带的,结果输入: 后,显示: 以为是没有安装,还利用apt-get install 命令安装了一堆东西,安装完了发现还是没有用。(⊙﹏⊙)b 后来看到如果是