android - 如何在 Android 上的 Kotlin 类中使用上下文
问题描述
在我的应用程序中,我使用Retrofit和okHttpClient来获取对服务器的一些请求。
在这个改造配置中,我想将一些数据发送Header
到服务器。
该数据是设备 UUID,对于获取设备 UUID ,我在一个类中编写以下代码(此类名称是 Extensions):
@SuppressLint("HardwareIds")
fun Context.getDeviceUUID(): String {
return try {
Settings.Secure.getString(contentResolver, Settings.Secure.ANDROID_ID)
} catch (e: Exception) {
"exception"
}
}
对于获取设备 UUID,我应该通过context
.
我想将此设备 UUID发送到ApiClient类。
ApiClient 类:
class ApiClient {
private val apiServices: ApiServices
init {
//Gson
val gson = GsonBuilder()
.setLenient()
.create()
//Http log
val loggingInterceptor = HttpLoggingInterceptor()
loggingInterceptor.level =
if (BuildConfig.DEBUG) HttpLoggingInterceptor.Level.BODY else HttpLoggingInterceptor.Level.NONE
//Http Builder
val clientBuilder = OkHttpClient.Builder()
clientBuilder.interceptors().add(loggingInterceptor)
clientBuilder.addInterceptor { chain ->
val request = chain.request()
request.newBuilder().addHeader("uuid", ).build()
chain.proceed(request)
}
//Http client
val client = clientBuilder
.readTimeout(NETWORK_CONNECTIONS_TIME, TimeUnit.SECONDS)
.writeTimeout(NETWORK_CONNECTIONS_TIME, TimeUnit.SECONDS)
.connectTimeout(NETWORK_CONNECTIONS_TIME, TimeUnit.SECONDS)
.retryOnConnectionFailure(true)
.build()
//Retrofit
val retrofit = Retrofit.Builder()
.baseUrl(BASE_URL)
.client(client)
.addConverterFactory(GsonConverterFactory.create(gson))
.addCallAdapterFactory(RxJava2CallAdapterFactory.createWithScheduler(Schedulers.io()))
.build()
//Init apiServices
apiServices = retrofit.create(ApiServices::class.java)
}
companion object {
private var apiClient: ApiClient? = null
val instance: ApiClient
get() {
if (apiClient == null) {
apiClient = ApiClient()
}
return apiClient as ApiClient
}
}
}
我应该在这段代码中使用getDeviceUUID :request.newBuilder().addHeader("uuid", ).build()
我怎样才能context
进入ApiClient类?
解决方案
您需要修改ApiClient
在get()
.
class APiClient(var deviceId: String) {
init {
//Stuff goes here
}
companion object {
private var apiClient: APiClient? = null
fun getInstance(deviceId: String): APiClient =
apiClient ?: synchronized(this) {
apiClient ?: APiClient(deviceId).also {
apiClient = it
}
}
}
}
PS,deviceUUID
可以是全局的,因为它不会改变。更好的方法是让它在 Global Access 中,就像在 Application 类中一样。从那里你可以直接使用它。无需每次都在构造函数中传递它。
推荐阅读
- c# - Botframework Web 应用程序 Azure IDX20803:无法从以下位置获取配置:'[PII 已隐藏]
- extjs - 在详细信息窗口中创建选择字段
- rest - 如何使用多部分使用 Postman 将文件上传到 Google 驱动器?
- dart - Flutter:在部分屏幕上更改主题亮度?
- python - 加入两个 Pyspark 数据帧的两种方法有什么区别
- java - Google PubSub 和来自 TOPIC 的重复消息
- asp.net-core - .Net核心请求过滤和文件下载
- pyspark - Pyspark 使用 collect_list 连接两个数据帧
- mysql - 按 ASC 和 DESC 排序的 SQL
- ruby-on-rails - 带条件的变量