在应用程序中初始化Retrofit客户端

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在应用程序中初始化Retrofit客户端相关的知识,希望对你有一定的参考价值。

如下?

val retro: Retro by lazy {
    PilotApp.retro!!
}

class PilotApp : Application() {

   companion object {
      var retro: Retro? = null
   }

   override fun onCreate() {
      retro = Retro(applicationContext)
      super.onCreate()
   }
}

这是一种很好的初始化方式吗?提前致谢。

答案

这不符合“控制倒置”的规则,这不是一个好主意。

这不是一个好主意的原因是因为每当一个类(如ViewModel,Fragment或Activity或......)想要使用retro时,他们必须通过调用第一行(PilotApp.retro)来获取Retro对象。

替代方案(称为Dependency Injection / Inversiondency Inversion)是在初始化时将Retro对象赋予类(同样,ViewModel或其他)。

这很重要的原因是因为使用第二种方法,您可以使您的类使用Retro,可测试。你可以给他们做你想做的RetroMock或TestRetro(例如,模拟一个api来返回一个错误)。

对于你的例子的另一个注意事项,你不需要使复古可以为空,你应该使你的var为lateinit并使其为非null。

以上是关于在应用程序中初始化Retrofit客户端的主要内容,如果未能解决你的问题,请参考以下文章

Android Retrofit 更新 HTTP 客户端配置

如何从片段中的 JSON 响应中的对象获取数据

当我使用 Retrofit 时,Google 位置服务返回一个空位置

java.lang.NoClassDefFoundError: retrofit2.Retrofit$Builder Fabric 初始化

Retrofit2:如何使授权令牌标头动态化?

如何使用 Swift 使用此代码片段为 iOS 应用程序初始化 SDK?