okhttp应用程序级别OkHttpClient实例

时间:2015-06-17 09:57:34

标签: java okhttp

如果我创建一个OkHttpClient实例来为我的“整个Android应用程序”提供服务,我想知道是否会出现任何性能瓶颈或问题。 I.e.在我的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();

2 个答案:

答案 0 :(得分:21)

使用单个实例不是问题,而是最佳实践。您可以查看来自github的类似应用程序,它使用匕首制作OkHttpClient单例并将其注入其他模块。

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

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

答案 1 :(得分:2)

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

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

  

应该共享OkHttpClients

     

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

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