将Retrofit实例保留在内存中是一种很好的做法吗?

时间:2017-09-19 04:08:31

标签: android performance caching retrofit retrofit2

我应该缓存由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个不同的接口/ apis),有时包含不再使用的实例。

1 个答案:

答案 0 :(得分:4)

我会说答案是“它取决于”。

没有任何缺点(我知道)缓存这些Retrofit固有的对象;它不像这些服务对象是设备电池寿命的大量消耗或类似的古怪。

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

根据我的个人经验,我并不担心动态创建新服务对象的性能成本。由于这样做,我从来没有注意到我的应用程序速度存在任何可察觉的差异。

一般情况下,我会建议您在之前优化,以便证明问题。我没有证明Retrofit.create()对我的用例来说太慢了,所以我每次都会动态调用它。