如果我创建一个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();
答案 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
实例的正确方法。