【发布时间】:2020-07-20 23:04:51
【问题描述】:
应用程序使用单例。其中一个包含Retrofit 客户端的实例。另一个包含常量。
我可以在应用偏好设置中更改服务器 URL(在活动中),以便在应用重启后我希望使用新的基本 URL 重新初始化 Retrofit 客户端。
在第一次启动后,所有的单例和类都被初始化。然后我更改活动中的 URL 并重新启动应用程序。现在单例不会初始化并包含旧常量。如果我强制停止应用程序或附加调试器,这些单例将按预期重新启动。
object ApiClass {
private val gsonConverter: GsonConverter = GsonConverter()
var gson: Gson
private set
var retrofit: Retrofit
private set
init {
Timber.i("*** start ApiClass")
val okHttpClient = OkHttpClient().newBuilder()
.connectTimeout(60, TimeUnit.SECONDS)
.readTimeout(60, TimeUnit.SECONDS)
.writeTimeout(60, TimeUnit.SECONDS)
.build()
gson = GsonBuilder().setLenient().create()
val url = "..." // Get a server URL from preferences.
Timber.i("*** " + url)
retrofit = Retrofit.Builder()
.baseUrl(url)
.client(okHttpClient)
.addConverterFactory(GsonConverterFactory.create(gson))
.build()
...
}
}
/////////////
object ApiConst {
init {
Timber.i("*** start ApiConst")
}
const val SOME_TEXT = "text"
}
如何在没有Force stop 应用的情况下重新初始化单例?
【问题讨论】:
-
我怀疑 Android 可能会保留您的应用程序的某些状态,事实是有状态的全局变量通常是有问题的,简单的解决方案是添加一个调用来重新初始化您的“ApiClass”。更好的解决方案是停止使用单例并将对象与应用程序生命周期联系起来
-
@al3c,谢谢!也许将
ApiClass更改为stackoverflow.com/questions/41672427/… 会有所帮助(著名的getInstance())。我会测试。
标签: android kotlin initialization singleton