okhttp应用程序级别OkHttpClient实例

Mut*_*ace 18 java okhttp

我想知道如果我创建一个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();
Run Code Online (Sandbox Code Playgroud)

bhd*_*rkn 23

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

你可以在这个讨论中看到JakeWharton也在暗示这种用法.

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

  • 此答案的两个链接都已过时。请更新链接或答案。 (4认同)
  • 如果我有多个域,则每个域应使用okhttp实例,对吗? (2认同)

dom*_*nik 11

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

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

OkHttpClients 应该被共享

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

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