gpt4 book ai didi

android - 在运行时更改改造 okhttp 客户端

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:37:54 25 4
gpt4 key购买 nike

fun getClient(token: String, userId: Long, language: String = "en", maxTry: Int = 2): Retrofit {
val okHttpClient = OkHttpClient.Builder()
okHttpClient.readTimeout(30, TimeUnit.SECONDS)
okHttpClient.connectTimeout(30, TimeUnit.SECONDS)
okHttpClient.writeTimeout(90, TimeUnit.SECONDS)
var tryCount = 0
okHttpClient.addInterceptor { chain ->
val original = chain.request()
val request = original.newBuilder()
.addHeader("Content-Type", "application/json")
.addHeader("secToken", token)
.addHeader("userId", userId.toString()).build()
var response = chain.proceed(request)
while (!response.isSuccessful && tryCount < maxTry) {
Log.d("intercept", "Request is not successful - $tryCount")
tryCount++
response = chain.proceed(request)
}
response
}

val builder = GsonBuilder()
builder.registerTypeAdapter(TransModel::class.java, NotificationTypeAdapter(language))
val gson = builder.create()

if (retrofit == null) {
retrofit = Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create(gson))
.client(okHttpClient.build())
.build()
} else {

}

// .client(getHttpClientForFile())
return retrofit!!
}

以上代码是为App中的每个请求获取单例改造客户端。

我需要做的是 retrofit 的 else 部分做什么 == null。

这里语言只初始化一次。在初始化改造时,但对于第二个请求,我不知道更改语言和请求的 maxTry 计数。

我想在运行时更改语言和 maxTry。对于每个请求,必须有不同的 maxTry 计数和可能的语言。

编辑:根据 @EarlOfEgo 的建议,我的其他部分是

 retrofit!!.newBuilder().baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create(gson))
.client(okHttpClient.build())
.build()

但它并没有改变语言。

编辑 2:传输模型

class TransModel {

var en: String = ""
var gu: String = ""
var hi: String = ""

constructor()

fun get(language: String): String? {
return when (language) {
LanguageUtil.languageEn -> {
en
}

LanguageUtil.languageGu -> {
gu
}

LanguageUtil.languageHi -> {
hi
}

else -> {
null
}
}
}

constructor(language: String, value: String) {
when (language) {
LanguageUtil.languageEn -> {
en = value
}

LanguageUtil.languageGu -> {
gu = value
}

LanguageUtil.languageHi -> {
hi = value
}
}
}

fun getValueByLanguage(language: String): String? {
return when (language) {
LanguageUtil.languageEn -> {
en
}

LanguageUtil.languageGu -> {
gu
}

LanguageUtil.languageHi -> {
hi
}

else -> {
null
}
}
}

fun updateIt(title: TransModel, currentLanguage: String) {
when (currentLanguage) {
LanguageUtil.languageEn -> {
gu = title.gu
hi = title.hi
}

LanguageUtil.languageGu -> {
en = title.en
hi = title.hi
}

LanguageUtil.languageHi -> {
gu = title.gu
en = title.en
}

}
}
}

和我的NotificationTypeAdapter

class NotificationTypeAdapter(val language: String) : TypeAdapter<TransModel>() {
override fun write(out: JsonWriter?, value: TransModel?) {
if (out == null || value == null) return
out.beginObject()
out.name("title")
out.value(value.getValueByLanguage(language))
out.endObject()
}

override fun read(reader: JsonReader?): TransModel? {
if (reader == null) return null
val jsonParser = JsonParser()
val je = jsonParser.parse(reader)
val trans = TransModel(language, (je.asString))
return trans
}
}

最佳答案

您可以使用 Retrofit 方法 newBuilder获得一个新的构建器并设置一个具有不同属性的不同 OkHttpClient。将类似这样的内容放入您的 else 案例中:

retrofit.newBuilder()
.client(anotherOkHttpClientWithOtherAttributes.build())
.build()

关于android - 在运行时更改改造 okhttp 客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50771130/

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