在运行时更改改进的okhttp客户端

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)

Ste*_*han 5

您可以使用Retrofit方法newBuilder来获取新的构建器,并设置OkHttpClient不同的属性.把这样的东西放到你的else情况:

retrofit.newBuilder()
        .client(anotherOkHttpClientWithOtherAttributes.build())
        .build()
Run Code Online (Sandbox Code Playgroud)


Lal*_*dav 0

由于我没有找到正确的答案,因此我每次通话都使用新的改造客户端。

return Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create(gson))
                .client(okHttpClient.build())
                .build()
Run Code Online (Sandbox Code Playgroud)

如果有人有更正确的答案,请给我推荐一些。