在没有上下文的情况下获取共享偏好
Get shared preferences without context
大家晚上好!我想使用共享首选项来存储我的令牌(我知道这不安全,我是 android 开发的新手,只想尝试)然后将其传递给拦截器。我如何在那里初始化共享首选项?谢谢!或者你能给我一个如何实现拦截器或存储令牌的提示吗?
抱歉,我已经尝试搜索此主题,无法实现其他开发人员的方法。
object NetworkModule {
var sharedPreferences = //GET SHARED PREFERENCES THERE
var authToken: String? = sharedPreferences.getString("Token", null)
val baseURL = //my base url
val loggingInterceptor = HttpLoggingInterceptor().apply {
level = HttpLoggingInterceptor.Level.BODY
}
var httpClient = OkHttpClient.Builder().addInterceptor { chain ->
chain.proceed(
chain.request().newBuilder().also { it.addHeader("Authorization", "Bearer $authToken") }
.build()
)
}.connectTimeout(10, TimeUnit.SECONDS)
.writeTimeout(30, TimeUnit.SECONDS)
.readTimeout(10, TimeUnit.SECONDS)
.addNetworkInterceptor(loggingInterceptor)
.build()
val retrofit = Retrofit.Builder().baseUrl(baseURL).addConverterFactory(
GsonConverterFactory.create()
).client(httpClient).build()
val api: API by lazy { retrofit.create() }
val apiClient = ApiClient(api)
}
您可以使用 ApplicationContext
从您的应用在任何地方 访问 SharedPreferences
。这是 Android 开发中非常普遍的做法,而且非常安全。
要访问 ApplicationContext
请参阅下面的代码:
在你的 Application
class 中添加一个 Application Singleton
.
class MyApplication : Application() {
override fun onCreate() {
super.onCreate()
instance = this
}
companion object {
lateinit var instance: MyApplication
private set
}
}
在您的应用中的任何地方使用ApplicationContext
!
var sharedPreferences = getApplicationContext() //here you go!
此代码可以完成工作,但是,如果您对最佳Android 开发实践感兴趣,请阅读此内容:
推荐2个选项
最佳实践:创建一个新的管理器class负责应用程序的整个SharedPreferences
使用(例如SharedPreferenceManager
).这个 class 是一个 Singleton
Class,它是用 ApplicationContext
实例化的,并且在 SharedPreferences
中具有与 CRUD 操作相关的所有方法,在你的例子中 setToken
和 getToken
。由于经理 class 是独立的,因此不应导致任何 Lifecycle
错误或 NullPointer
错误。
由于附上示例代码会使我的答案混乱,我决定引用 someone else's code here, this will teach you how to implement it.
如果您懒得遵循#2:您可以使用已经为您完成此操作的库:Pixplicity/EasyPrefs.
- 像
Manager
一样易于使用Class ✅
- 没有更多与
SharedPreferences
相关的错误 ✅
- 您可以随时改造任何现有项目 ✅
如果您有任何问题,请告诉我。谢谢
在实际实现中使用这些:
actual typealias PlatformContext = Activity //Android
actual typealias PlatformContext = NSObject //iOS
这是实现此目标并解决了我的问题的好教程:
UserDefaults and SharedPreference in KMM
大家晚上好!我想使用共享首选项来存储我的令牌(我知道这不安全,我是 android 开发的新手,只想尝试)然后将其传递给拦截器。我如何在那里初始化共享首选项?谢谢!或者你能给我一个如何实现拦截器或存储令牌的提示吗?
抱歉,我已经尝试搜索此主题,无法实现其他开发人员的方法。
object NetworkModule {
var sharedPreferences = //GET SHARED PREFERENCES THERE
var authToken: String? = sharedPreferences.getString("Token", null)
val baseURL = //my base url
val loggingInterceptor = HttpLoggingInterceptor().apply {
level = HttpLoggingInterceptor.Level.BODY
}
var httpClient = OkHttpClient.Builder().addInterceptor { chain ->
chain.proceed(
chain.request().newBuilder().also { it.addHeader("Authorization", "Bearer $authToken") }
.build()
)
}.connectTimeout(10, TimeUnit.SECONDS)
.writeTimeout(30, TimeUnit.SECONDS)
.readTimeout(10, TimeUnit.SECONDS)
.addNetworkInterceptor(loggingInterceptor)
.build()
val retrofit = Retrofit.Builder().baseUrl(baseURL).addConverterFactory(
GsonConverterFactory.create()
).client(httpClient).build()
val api: API by lazy { retrofit.create() }
val apiClient = ApiClient(api)
}
您可以使用 ApplicationContext
从您的应用在任何地方 访问 SharedPreferences
。这是 Android 开发中非常普遍的做法,而且非常安全。
要访问 ApplicationContext
请参阅下面的代码:
在你的
Application
class 中添加一个Application Singleton
.class MyApplication : Application() { override fun onCreate() { super.onCreate() instance = this } companion object { lateinit var instance: MyApplication private set } }
在您的应用中的任何地方使用
ApplicationContext
!var sharedPreferences = getApplicationContext() //here you go!
此代码可以完成工作,但是,如果您对最佳Android 开发实践感兴趣,请阅读此内容:
推荐2个选项
最佳实践:创建一个新的管理器class负责应用程序的整个
SharedPreferences
使用(例如SharedPreferenceManager
).这个 class 是一个Singleton
Class,它是用ApplicationContext
实例化的,并且在SharedPreferences
中具有与 CRUD 操作相关的所有方法,在你的例子中setToken
和getToken
。由于经理 class 是独立的,因此不应导致任何Lifecycle
错误或NullPointer
错误。由于附上示例代码会使我的答案混乱,我决定引用 someone else's code here, this will teach you how to implement it.
如果您懒得遵循#2:您可以使用已经为您完成此操作的库:Pixplicity/EasyPrefs.
- 像
Manager
一样易于使用Class ✅ - 没有更多与
SharedPreferences
相关的错误 ✅ - 您可以随时改造任何现有项目 ✅
- 像
如果您有任何问题,请告诉我。谢谢
在实际实现中使用这些:
actual typealias PlatformContext = Activity //Android
actual typealias PlatformContext = NSObject //iOS
这是实现此目标并解决了我的问题的好教程: UserDefaults and SharedPreference in KMM