使用Dagger2创建时,retrofit2中的动态设置

问题描述 投票:0回答:1

我为dagger2创建了retrofit2模块

@Module
public class NetworkModule {

    private Context context;

    public NetworkModule(Application app) {
        this.context = app;
    }

    @Singleton
    @Provides
    Context providesContext() {
        return context;
    }

    @Singleton
    @Provides
    OkHttpClient providesOkHttpClient(Utils utils) {
        User user = utils.getSettings();
        return new OkHttpClient.Builder()
                .connectTimeout(Long.valueOf(user.getTimeOut()), TimeUnit.SECONDS)
                .writeTimeout(Long.valueOf(user.getTimeOut()), TimeUnit.SECONDS)
                .readTimeout(Long.valueOf(user.getTimeOut()), TimeUnit.SECONDS)
                .build();
    }

    @Singleton
    @Provides
    Retrofit providesRetrofit(OkHttpClient okHttpClient, Utils utils) {
        User user = utils.getSettings();
        String host = user.getHost();
        if (!host.endsWith("/")) host += "/";
        return new Retrofit.Builder()
                .baseUrl(host)
                .addConverterFactory(JacksonConverterFactory.create())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .client(okHttpClient).build();
    }

    @Singleton
    @Provides
    RestApiFactory providesRestApiFactory(Retrofit retrofit) {
        return new RestApiFactory(retrofit);
    }
}

我有设置活动,用户可以在其中更改baseUrl,timeOut。如果我创造

providesRetrofit 
providesRestApiFactory
providesOkHttpClient

@Singleton - 更改设置后它不会改变。如果我删除@Singleton注释 - 所有工作。我的问题 - 当用户更改数据时,如何更新dagger @Singleton

android retrofit2 dagger-2
1个回答
0
投票

将NetworkModule放在单独的组件(可能是主组件的子组件)中,并在用户更改baseUrl,timeout等时重新创建它。

您可以通过创建使用@Subcomponent注释的界面并在其中添加网络模块来实现。您可以通过从主要组件调用您还需要添加的方法来实例化此子组件。

详细教程

https://google.github.io/dagger/subcomponents.html

© www.soinside.com 2019 - 2024. All rights reserved.