【发布时间】:2017-10-25 19:13:05
【问题描述】:
我知道对整个应用程序使用单个 OkHttpClient 实例是最佳实践。但我遇到了 TrustKit,我需要实现下一个代码:
OkHttpClient.Builder builder = new OkHttpClient().newBuilder();
URL url = new URL("https://www.url.com");
String serverHostname = url.getHost();
builder.sslSocketFactory(TrustKit.getInstance().getSSLSocketFactory(serverHostname),
TrustKit.getInstance().getTrustManager(serverHostname)).build();
然后我意识到,也许正确的方法是每个域有一个实例。目前我必须实现证书固定,并且我在我的应用程序中有多个域,我可以在其中获取我的应用程序所需的信息。
所以问题是:当您尝试实例化 OkHttpClient 时,如果您有多个域,最佳实践是什么?每个域一个实例?
【问题讨论】:
-
您特定的“每个域一个实例”限制来自您对 TrustKit-Android 的使用。并非所有开发人员都使用它,因此它的限制不适用于单独使用 OkHttp3 进行证书固定或与其他库(例如,我的 CWAC-NetSecurity)结合使用的人。在使用 TrustKit-Android 的具体场景中,每个域可能需要一个
OkHttpClient。否则,AFAIK,标准是每个进程一个OkHttpClient,除非有其他限制因素。 -
你说得对,这个限制来自于 TrustKit-Android。所以这就是我想知道我是否没有那个限制的原因,我需要为每个域实现一个实例或继续使用一个实例。你知道我在哪里可以获得关于“每个进程一个 OkHttpClient”@CommonsWare 的信息吗?
-
好吧,不小心使用大量
OkHttpClient实例可能会遇到问题,如this developer discovered。通常,您希望最大限度地共享线程和连接以及其他东西,因此每个进程都有一个可以实现这一目标。如果您有多个OkHttpClient实例,您可能希望它们共享一个ConnectionPool之类的东西,如该答案中所述。 -
你也可以从一个根 OkHttpClient 实例开始,每增加一个主机 hostClient = rootClient.newBuilder().xxx.build()