【问题标题】:What will happen if every request has a retrofit instance?如果每个请求都有一个改造实例会发生什么?
【发布时间】:2017-08-10 05:13:03
【问题描述】:

我最近在想一个问题。

如果每个请求都有一个改造实例,会发生什么?

我希望每个请求都有一个改造实例的原因:

每个 retrofit 实例 都有一个 OkHttpClient 实例,所以我想添加 拦截到 OkhttpClient,但不是每个请求都应该 拦截,我还想在 OkHttpClient 中添加一些相同的标头,但不是每个请求都必须有这些相同的标头,比如登录请求时,我不需要添加令牌。,但其他请求可能需要。

所以我的方法是让每个请求都有一个改造实例,我之前有一个demo,但是请求的数量很少,所以我不确定是否当请求太多麻烦吗?

我有 2 个问题:

1.会不会产生一些异常?还是会导致堆栈溢出?

2.如果有更好的方法来解决这个问题?

是否有其他人有同样的经历或有一些想法要质疑?

【问题讨论】:

  • 我使用一个带有拦截器的 OkHttpClient 实例,然后在拦截方法中使用 SharedPreferences 检查登录状态。

标签: android rx-java retrofit2


【解决方案1】:

您可以使用@Headers 注释将静态/动态标头添加到Retrofit。此外,您不应按照文档中的说明创建单独的 OkHttp 实例:

当您创建单个 OkHttpClient 实例并将其重用于所有 HTTP 调用时,OkHttp 性能最佳。这是因为每个客户端都拥有自己的连接池和线程池。重用连接和线程可减少延迟并节省内存。相反,为每个请求创建一个客户端会浪费空闲池上的资源。

如果您想为每个 OkHttp 设置不同的配置,只需使用 client.newBuilder()(从版本 3.x 开始提供):

您可以使用 newBuilder() 自定义共享 OkHttpClient 实例。这将构建一个共享相同连接池、线程池和配置的客户端。使用构建器方法为特定目的配置派生客户端。

如果@Headers 不适合您,只需创建尽可能多的OkHttpClient 配置以创建不同的Retrofit 服务即可。

http://square.github.io/okhttp/3.x/okhttp/

【讨论】:

    猜你喜欢
    • 2012-01-07
    • 2013-02-19
    • 1970-01-01
    • 2020-11-15
    • 2017-03-24
    • 1970-01-01
    • 2014-12-29
    • 1970-01-01
    • 2014-01-15
    相关资源
    最近更新 更多