gpt4 book ai didi

java - 使用 Retrofit 和 dagger 2 动态更改基本 Url

转载 作者:行者123 更新时间:2023-12-01 17:55:01 30 4
gpt4 key购买 nike

我正在为我的应用程序使用 Retrofit & Dagger2。我想根据用户在 Spinner 中选择的内容动态更改应用程序的 baseUrl。

在互联网上花了几个小时后,我得出的结论是可以动态更改 baseUrl。

依赖注入(inject)如下所示:

APi模块

  @Module
public class ApiModule {

String mBaseUrl;

public ApiModule(String mBaseUrl) {
this.mBaseUrl = mBaseUrl;
}

@Provides
@Singleton
OkHttpClient provideOkhttpClient(Cache cache) {
OkHttpClient.Builder client = new OkHttpClient.Builder();
HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
// set your desired log level
logging.setLevel(HttpLoggingInterceptor.Level.BODY);
client.addInterceptor(logging);
client.cache(cache);
return client.build();
}

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

我根据互联网上的引用创建了一个额外的类(class)

HostSelectionInterceptor.java

import java.io.IOException;
import javax.inject.Singleton;
import dagger.Module;
import dagger.Provides;
import okhttp3.HttpUrl;
import okhttp3.Interceptor;
import okhttp3.Request;
/** An interceptor that allows runtime changes to the URL hostname. */
@Module(includes = {ApiModule.class})
public final class HostSelectionInterceptor implements Interceptor {
private volatile String host;

@Provides
@Singleton
public String setHost(String host) {
this.host = host;
return this.host;
}

public String getHost() {
return host;
}

@Provides
@Singleton
@Override
public okhttp3.Response intercept(Chain chain) {
Request request = chain.request();
String host = getHost();
if (host != null) {
/* HttpUrl newUrl = request.url().newBuilder()
.host(host)
.build();*/
HttpUrl newUrl = HttpUrl.parse(host);
request = request.newBuilder()
.url(newUrl)
.build();
}
try {
return chain.proceed(request);
} catch (IOException e) {
e.printStackTrace();
}

return null;
}
}

现在,我的问题是如何使用 HostSelectionInterceptor 来更改 Spinner 时的 baseUrl。

最佳答案

您可以使用@Named(或使用@Qualifier注释的自定义注释)添加如下注释:

@Singleton
@Provides
@Named("picture")
Retrofit providePictureRetrofit(GsonConverterFactory gsonConverterFactory, RxJavaCallAdapterFactory rxJavaCallAdapterFactory) {
return retrofit = new Retrofit.Builder()
.baseUrl(MarsWeatherWidget.PICTURE_URL) // one url
.build();
}



@Singleton
@Provides
@Named("weather")
Retrofit provideWeatherRetrofit(GsonConverterFactory gsonConverterFactory, RxJavaCallAdapterFactory rxJavaCallAdapterFactory) {
return retrofit = new Retrofit.Builder()
.baseUrl(MarsWeatherWidget.WEATHER_URL) // other url
.build();
}

注入(inject)合格版本

当您的模块提供限定类型时,您只需要在需要依赖项的位置添加限定符即可。

MyPictureService provideService(@Named("picture") Retrofit retrofit) {
// ...
}

关于java - 使用 Retrofit 和 dagger 2 动态更改基本 Url,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45751541/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com