2017-12-27 309 views
0

创建我创建retrofit2动态设置,当它与Dagger2

@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); 
    } 
} 

dagger2模块我有设置活动,其中用户可以改变的baseUrl,超时。如果我创建

providesRetrofit 
providesRestApiFactory 
providesOkHttpClient 

@Singleton - 后改变设置也不会改变。如果我删除@Singleton注释 - 所有的工作。我的问题 - 当用户更改数据时,如何更新匕首@Singleton?在单独的组件

+0

再次尝试拨打Builder.build。这可能需要一大笔费用,我不知道,但它可能是工作。 – VolkanSahin45

回答

0

广场NetworkModule(你的主要成分有可能子组件),当用户改变的baseUrl重建,超时等

你可以通过创建与@Subcomponent注释的接口并添加您的网络模块存在。您可以通过从您的主要组件中调用您还需要添加的方法来实例化此子组件。

详细的教程

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