java - 如何使用 dagger2 在改造模块中添加动态基本 url

标签 java android dagger-2

我在我的应用程序中使用 dagger2。我有一个模块提供一些依赖项,例如 RetrofitGson 等。

NetModule.java

@Module
public class NetModule {

    private String mBaseUrl;

    public NetModule(String baseUrl) {
        this.mBaseUrl = baseUrl;
    }

    @Provides
    @Singleton
    SharedPreferences providesSharedPreferences(Application application) {
        return PreferenceManager.getDefaultSharedPreferences(application);
    }

    @Provides
    @Singleton
    Cache provideOkHttpCache(Application application) {
        int cacheSize = 10 * 1024 * 1024; // 10 MiB
        Cache cache = new Cache(application.getCacheDir(), cacheSize);
        return cache;
    }

    @Provides
    @Singleton
    Gson provideGson() {
        GsonBuilder gsonBuilder = new GsonBuilder();
        gsonBuilder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES);
        return gsonBuilder.create();
    }

    @Provides
    @Singleton
    OkHttpClient provideOkHttpClient(Cache cache) {
        OkHttpClient okHttpClient = new OkHttpClient();
        okHttpClient.newBuilder()
                //.addNetworkInterceptor(REWRITE_CACHE_CONTROL_INTERCEPTOR)
                .cache(cache)
                .build();
        return okHttpClient;
    }

    @Provides
    @Singleton
    Retrofit provideRetrofit(Gson gson, OkHttpClient okHttpClient) {
        Retrofit retrofit = new Retrofit.Builder()
                .addConverterFactory(GsonConverterFactory.create(gson))
                .baseUrl(mBaseUrl)
                .client(okHttpClient)
                .build();
        return retrofit;
    }
}

NetComponent.java

@Singleton
@Component(modules = {AppModule.class, NetModule.class, Validator.class})
public interface NetComponent {
    void inject(AuthenticationActivity authenticationActivity);
    void inject(PaymentActivity paymentActivity);
}

AppApplication.java

@Override
public void onCreate() {
    super.onCreate();

    mNetComponent = DaggerNetComponent.builder()
            .appModule(new AppModule(this))
            .netModule(new NetModule("https://corporateapiprojectwar.mybluemix.net/corporate_banking/mybank/"))
            .build();

}

这种方法一直有效,直到我的完整应用程序只有一个基本 URL。现在,我的 AuthenticationActivityPaymentActivity 有不同的基本 Url,因此我无法在 onCreateNetModule 构造函数中发送 Url 应用程序

任何人都可以帮助我如何使用 dagger2 添加改造的动态基本 Url。

最佳答案

您可以使用@Named注释Dagger2 user guide (参见“资格赛”部分):

在您的NetModule.java中:

@Provides
@Singleton
@Named("authRetrofit")
public Retrofit provideAuthRetrofit() {
  // setup retrofit for authentication
  return retrofit;
}

@Provides
@Singleton
@Named("paymentRetrofit")
public Retrofit providePaymentRetrofit() {
  // setup retrofit for payments
  return retrofit;
}

在您的AuthenticationActivity中:

@Inject
@Named("authRetrofit")
Retrofit retrofit;

最后在您的PaymentActivity.java中:

@Inject
@Named("paymentRetrofit")
Retrofit retrofit;

然后 dagger 将自动将为支付配置的 Retrofit 注入(inject)到 PaymentActivity 中,并将为身份验证配置的 Retrofit 注入(inject)到 AuthenticationActivity

关于java - 如何使用 dagger2 在改造模块中添加动态基本 url,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43161887/

相关文章:

java - Java 中的 Locale setDefault() 风险

java - 如何使用 appium 自动化/测试 Android 混合应用程序?

android - Eclipse - 新的 android Activity 显示在 list 中但在 src 下丢失

android - Android 服务中的 Hilt 注入(inject)

android - 如何使用 Espresso 在 Instrumentation 测试中注入(inject) Mocked Presenter of Activity

java - 嵌入式 JavaFX、注入(inject) View 和 Dagger 2

java - 并行播放相同的声音两次

java - 解析月份不带前导 0 的日期

Android 和谷歌地图 - 使用后退按钮关闭信息窗口

android - 传递一个简单的变量值以在 Android 中的另一个类中使用