【问题标题】:Is a good practice to keep Retrofit instances in memory?将 Retrofit 实例保留在内存中是一种好习惯吗?
【发布时间】:2018-02-27 17:17:08
【问题描述】:

我应该缓存 Retrofit 生成的对象还是建议动态创建?

我开始从旧的网络框架逐步迁移到 Retrofit,它从一个非常基本的逻辑开始,用于缓存 Retrofit 创建的实例。这是由于我们的架构将在不同的活动/片段中使用不同的端点,当用户访问应用程序的不同部分时将调用此方法:

static public <T> T getApi(Class<T> apiInterface) {
  validateInitialization("getApi()");

  if (!mApis.containsKey(apiInterface.getSimpleName())) {
    mApis.put(apiInterface.getSimpleName(), retrofit().create(apiInterface));
  }

  return (T) mApis.get(apiInterface.getSimpleName());
}

但是,随着我们继续迁移我们的架构以使用 Retrofit,此地图的大小正在增加(目前可以创建大约 20 个不同的接口/api)并且有时包含不再使用的实例。

【问题讨论】:

标签: android performance caching retrofit retrofit2


【解决方案1】:

我会说答案是“视情况而定”。

缓存这些对象是 Retrofit 固有的,没有缺点(我知道);并不是说这些服务对象会大量消耗设备的电池寿命或类似的古怪东西。

相反,它归结为您希望避免的缺点:服务对象可能会消耗“额外”内存,而这些服务对象将不会再次使用但无法进行垃圾回收,或者可能会导致“缓慢”通过为每个调用创建一个新的服务对象。唯一的选择方法是分析您的应用和用户的行为/偏好,然后决定您更愿意采用哪种方式。

根据我的个人经验,我并不担心动态创建新服务对象的性能成本。我从来没有注意到我的应用程序的速度因此而有任何明显的差异。

一般来说,我建议不要在发现问题之前进行优化。我没有证据证明 Retrofit.create() 对于我的用例来说太慢了,所以我每次都在运行中调用它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-24
    • 2017-02-20
    • 1970-01-01
    • 1970-01-01
    • 2012-11-30
    • 1970-01-01
    相关资源
    最近更新 更多