面试题答案
一键面试实现思路
- 创建动态配置Base URL的机制:可以通过在应用层维护一个可变的Base URL变量,这个变量可以根据业务场景或用户配置进行更新。
- 在Retrofit构建时使用动态Base URL:Retrofit在构建时需要一个
HttpUrl
类型的Base URL。我们可以将维护的动态Base URL转换为HttpUrl
并传递给Retrofit构建器。 - 处理多线程安全:如果在多线程环境下修改Base URL,需要确保线程安全,比如使用
volatile
关键字修饰Base URL变量,或者使用线程安全的集合来管理配置。
关键代码片段
import okhttp3.HttpUrl
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
// 维护一个可变的Base URL变量
private var baseUrl: String? = null
// 获取Retrofit实例的方法
fun getRetrofit(): Retrofit {
// 确保Base URL不为空
if (baseUrl == null) {
throw IllegalArgumentException("Base URL is not set.")
}
val httpUrl = HttpUrl.parse(baseUrl!!)
?: throw IllegalArgumentException("Invalid Base URL: $baseUrl")
return Retrofit.Builder()
.baseUrl(httpUrl)
.addConverterFactory(GsonConverterFactory.create())
.build()
}
// 更新Base URL的方法
fun setBaseUrl(newBaseUrl: String) {
baseUrl = newBaseUrl
}
在使用时:
// 设置Base URL
setBaseUrl("https://example.com/api/")
val retrofit = getRetrofit()
val apiService = retrofit.create(ApiService::class.java)
其中ApiService
是定义Retrofit接口的类,例如:
interface ApiService {
@GET("endpoint")
suspend fun getData(): Response<DataModel>
}