应用重启后重新初始化单例类

时间:2020-07-20 14:06:41

标签: android kotlin initialization singleton

应用程序使用单例。其中一个包含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应用的情况下重新初始化单例?

1 个答案:

答案 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的应用程序来处理请求,从而不必重启应用程序。

相关问题