应用程序使用单例。其中一个包含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
应用的情况下重新初始化单例?
答案 0 :(得分:0)
由于@ al3c,我发现重新初始化单例是没有用的。我试图将一种形式的单例更改为另一种形式(例如在How to make a singleton for retrofit 2?中):
class ApiClass {
var gson: Gson private set
lateinit var retrofit: Retrofit private set
private val gsonConverter: GsonConverter = GsonConverter()
private val okHttpClient: OkHttpClient
init {
Timber.i("*** start ApiClass")
okHttpClient = OkHttpClient().newBuilder()
...
}
companion object {
private var instance: ApiClass? = null
fun getInstance(): ApiClass {
if (instance == null) instance = ApiClass()
return instance!!
}
}
}
但是调用ApiClass.getInstance().retrofit
并没有帮助我重新启动后重新创建ApiClass
。然后,我尝试在销毁应用程序之前在Retrofit
客户端中更改基本URL (以便在重启后它将具有新的URL)。阅读Retrofit - Change BaseUrl后,我写道:
fun setBaseUrl(url: String) {
retrofit = Retrofit.Builder()
.baseUrl(url)
.client(okHttpClient)
.addConverterFactory(GsonConverterFactory.create(gson))
.build()
}
然后,我能够从setBaseUrl
的首选项活动中调用onDestroy
来更改Retrofit
客户。另外,它还帮助我继续使用带有新URL的应用程序来处理请求,从而不必重启应用程序。