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

时间:2018-06-09 05:14:54

标签: android retrofit2 okhttp

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中的每个请求获取singleton改造客户端。

我需要做的是在改造的其他部分做什么== null。

此处语言仅初始化一次。在初始化改造时,但对于第二个请求,我无意更改语言和maxTry计数请求。

我想更改语言,并在运行时更新。对于每个请求,必须有不同的maxTry计数,也可以使用语言。

修改 根据 @EarlOfEgo 的建议,我的其他部分是

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

但它没有改变语言。

编辑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
            }

        }
    }
}

和我的 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
    }
}

4 个答案:

答案 0 :(得分:5)

您可以使用Retrofit方法newBuilder来获取新构建器,并设置具有不同属性的不同list1 = ['2018-24', '2018-23', '2018-22', '2018-21', '2018-20', '2018-19', '2018-18', '2018-17', '2018-16', '2018-15', '2018-14', '2018-13', '2018-12', '2018-11'] new_list = [0, 0, 0, 0, 0, 0, 0, 0 , 0, 0, 3, 1, 3, 1] 。把这样的东西放到你的OkHttpClient案例中:

else

答案 1 :(得分:1)

您可以将凭据手册作为标题添加到您的请求中。

示例:

NaN

答案 2 :(得分:1)

您可以在运行时更改 BASE_URL ,方法是使用 @Url 批注将其作为参数传递。

@FormUrlEncoded
@POST()
fun testService(@Url baseUrl: String,
                @Field("exampleParam") exampleParam: String): Observable<String>

请尝试此操作,如有任何疑问,请通知我。

答案 3 :(得分:0)

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

return Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create(gson))
                .client(okHttpClient.build())
                .build()

如果有人有更正确的答案,请建议我一些。