Lal*_*dav 9 android okhttp retrofit2
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!!
}
Run Code Online (Sandbox Code Playgroud)
上面的代码是为App中的每个请求获取singleton改造客户端.
我需要做的是在改造的其他部分做什么== null.
这里语言只初始化一次.虽然初始化改造,但对于第二个请求我不知道更改语言和maxTry计数请求.
我想改变语言,并在运行时更新.对于每个请求,必须有不同的maxTry计数,也可以使用语言.
编辑: 根据@EarlOfEgo的建议,我的其他部分是
retrofit!!.newBuilder().baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create(gson))
.client(okHttpClient.build())
.build()
Run Code Online (Sandbox Code Playgroud)
但它并没有改变语言.
编辑2: TransModel
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
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
和我的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
}
}
Run Code Online (Sandbox Code Playgroud)
您可以使用Retrofit方法newBuilder来获取新的构建器,并设置OkHttpClient不同的属性.把这样的东西放到你的else情况:
retrofit.newBuilder()
.client(anotherOkHttpClientWithOtherAttributes.build())
.build()
Run Code Online (Sandbox Code Playgroud)
由于我没有找到正确的答案,因此我每次通话都使用新的改造客户端。
return Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create(gson))
.client(okHttpClient.build())
.build()
Run Code Online (Sandbox Code Playgroud)
如果有人有更正确的答案,请给我推荐一些。
| 归档时间: |
|
| 查看次数: |
1283 次 |
| 最近记录: |