【问题标题】:okhttp application level OkHttpClient instanceokhttp 应用层 OkHttpClient 实例
【发布时间】:2015-09-02 11:47:12
【问题描述】:

我想知道如果我创建一个 OkHttpClient 实例来服务我的“整个 android 应用程序”,是否会出现任何性能瓶颈或问题。即在我的 Application 类中,我创建了一个包含 OkHttpClient 实例的静态公共变量,每当我需要执行 http 请求时,我基本上都会构建一个请求对象,然后使用创建的 okhttpclient 实例来触发请求。

代码是这样的

public class MyApplication extends Application {
    public static OkHttpClient httpClient;

    @Override
    public void onCreate() {
        super.onCreate();

        httpClient = new OkHttpClient();
    }

}

// Making request 1
Request request1 = new Request.Builder().url(ENDPOINT).build();
Response response = MyApplication.httpClient.newCall(request1).execute();

// Making request 2
Request request2 = new Request.Builder().url(ENDPOINT).build();
Response response = MyApplication.httpClient.newCall(request2).execute();

【问题讨论】:

    标签: java okhttp


    【解决方案1】:

    使用单个实例不是问题,而是一种常见的做法。你可以从github 中查看一个类似的应用程序,它使用 dagger 制作 OkHttpClient 单例并将其注入其他模块。

    你可以看到in this discussion JakeWharton也暗示了这种用法。

    但如果你为此目的使用单例模式会更好。

    【讨论】:

    • 谢谢@bhdrkn。我已经看到了讨论和单例风格,我想我会去的。
    • 请注意:单实例不等同于单例thekua.com/atwork/2009/01/singleton-vs-single-instance
    • 如果我有多个域,我应该为每个域使用一个 okhttp 实例,对吧?
    • 此答案的两个链接都已过时。请更新链接或答案。
    【解决方案2】:

    除了@bhdrkn 正确建议之外,要明确确认OkHttpClient 的单例实例是正确的方法,摘自文档:

    来源:https://square.github.io/okhttp/3.x/okhttp/okhttp3/OkHttpClient.html

    OkHttpClients 应该共享

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

    请参阅 Javadoc(上面的链接)以查看初始化 OkHttpClient 实例的正确方法。

    【讨论】:

      猜你喜欢
      • 2016-04-21
      • 1970-01-01
      • 2019-12-15
      • 2016-02-11
      • 2016-04-13
      • 1970-01-01
      • 2016-04-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多