当前位置: 首页 > 知识库问答 >
问题:

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

花阳辉
2023-03-14

应用程序使用单例。 其中一个包含revofit客户端的实例。 另一个包含常量

我可以在app preferences(在activity)中更改服务器URL,这样在应用程序重新启动后,我就可以用新的基本URL重新初始化revofit客户端。

在第一次启动之后,所有的单例和类都被初始化。 然后我在activity中更改URL并重新启动应用程序。 现在singletons不初始化并且包含旧常量。 如果我强制停止应用程序或附加调试器,这些单例程序会像预期的那样重新启动。

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"
}

如何在不强制停止应用程序的情况下重新初始化单例程序?

共有1个答案

颛孙国源
2023-03-14

多亏了@AL3C,我发现重新初始化singletons是没有用的。 我试着将一种形式的单例改变成另一种形式(比如在如何为改型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().reverfit并不能帮助我在重新启动后重新创建APIClass。 然后,我尝试在销毁应用程序之前更改revofit客户端中的一个基本URL(以便在重新启动后它将有一个新的URL)。 在阅读了Rovetfit-Change BaseUrl之后,我写道:

fun setBaseUrl(url: String) {
    retrofit = Retrofit.Builder()
        .baseUrl(url)
        .client(okHttpClient)
        .addConverterFactory(GsonConverterFactory.create(gson))
        .build()
}

然后,我能够从ondestroy中的首选项activity调用setbaseurl来更改revofit客户端。 它还帮助我继续使用新的URL请求应用程序,这样我就不必重新启动应用程序。

 类似资料:
  • 背景-我正在将一些遗留代码重构到spring web-mvc框架中。 我使用的是Spring5.0.5.Release和tomcat 8.5.31。 我将通过eclipse Oxygen.3a发行版(4.7.3a)和Fedora28启动该应用程序。 问题-当启动tomcat时,应用程序调度程序间歇性地(大约75%的时间)重新启动。似乎在应用程序加载之后,我得到一个完成的消息,然后重新加载。 在完成

  • 问题内容: 我愿意在应用程序中添加一个按钮,单击该按钮将重新启动该应用程序。我搜索谷歌,但没有发现任何有用的,除了这一个。但是,此处遵循的过程违反了Java的WORA概念。 是否有其他以Java为中心的方法来实现此功能?是否可以只派生另一个副本然后退出? 提前致谢。我感谢您的帮助。 @deporter我已经尝试过您的解决方案,但是它不起作用:( @mKorbel我写的,采取的概念下面的代码,你曾在

  • 问题内容: 我目前在 此URL实际上按照以下路由指示加载Module.js类: 这包含在index.js文件中定义的和元素中。 Module类具有和方法。这些设置了记录2的初始详细信息和装入信息。到目前为止一切正常。 现在,我的问题是,在Module.js的孙组件中,我使用以下Redirect重定向到另一个页面,例如第3页: 构造函数或componentWillMount无法运行,因此记录#3无法

  • 问题内容: 如何重新启动Java AWT应用程序?我有一个附加了事件处理程序的按钮。我应该使用什么代码来重新启动应用程序? 我想做与应用程序中相同的事情。 问题答案: 当然,可以重新启动Java应用程序。 以下方法显示了一种重新启动Java应用程序的方法: 基本上,它执行以下操作: 查找Java可执行文件(我在这里使用了Java二进制文件,但这取决于您的要求) 查找应用程序(在我的情况下是一个ja

  • 我希望容器在计算机重新启动后自动启动,所以我使用'--restart=always'标志,但它并没有像我预期的那样运行。当我重新启动系统时,容器没有启动。 docker日志信息 添加docker ps-a message,$docker ps-a CONTAINER ID IMAGE命令CREATED STATUS PORTS NAMES a1f4d5471b0a mysql:8.0“docker

  • 问题内容: 我有这样的事情: 我想重新初始化再次调用静态初始化程序的JVM,然后! 能做到吗 问题答案: 您可以使用自定义类加载器启动应用程序,这将允许您加载和卸载静态变量。 但是,基本上,这样做是非常糟糕的设计。我喜欢将字段定为最终字段,但如果要更改它们,则不应将其定为最终字段。

  • 我正在写一个UWP应用程序,我有一个ScheduledToastNotification在应用程序挂起时添加到日程中(例如,像一个提醒)。但是,如果我关闭了app,通知准时出现,但是当我点击通知时(没有按钮,一般只是在通知上),app没有正确启动,停在闪屏处。 如何使应用程序正确地重新启动? 多谢了。

  • 我是C编程的初学者,如果我能得到一些关于如何重新启动程序的提示,我将不胜感激?我目前正在开发一个猜测游戏,用户有10次尝试猜测随机提供的秘密号码。我希望该程序能够从一开始就为用户提供新一轮游戏(尝试次数1猜测次数:),这意味着重新运行该程序。 以下是节目: