okhttp 应用程序级别 OkHttpClient 实例

2022-09-01 15:38:21

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

答案 1

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

你可以在这次讨论中看到,JakeWharton也建议使用这种用法。

但是,如果将单例模式用于此目的,则更好。


答案 2

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

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

OkHttpClients 應該被共享

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

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


推荐