【问题标题】:Is creating HttpClient expensive?创建 HttpClient 是否昂贵?
【发布时间】:2015-09-26 10:52:27
【问题描述】:

我在Android中看到了一些例子实现maybeCreateHttpClient(),特别是在谷歌示例中,它的作用是检查HttpClient对象是否被实例化,如果没有,实例化它,然后重用它。

为什么采用这种方法?创建新的 HttpClient 成本高吗?

【问题讨论】:

  • 我不知道昂贵的,但它可以是有状态的。饼干罐之类的东西。
  • 好点@Thilo。如果您执行某种身份验证,您将需要保持相同的 httpclient,否则您的凭据将不会被传递给每个后续调用。

标签: android httpclient


【解决方案1】:

使用连接池(例如 ThreadSafeClientConnManager)来管理您的客户端。

HttpParams params = new BasicHttpParams();
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset(params, HTTP.DEFAULT_CONTENT_CHARSET);
HttpProtocolParams.setUseExpectContinue(params, true);

SchemeRegistry registry = new SchemeRegistry();
registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
registry.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));

ClientConnectionManager connman = new ThreadSafeClientConnManager(params, registry);
client = new DefaultHttpClient(connman, params);

client 是一个可以重复使用的单例对象,用于触发请求:

HttpResponse response = client.execute(new HttpGet(URL));

【讨论】:

  • 也就是说,后续的httpclient调用将被放入队列,直到前一个完成?
  • 您可以设置一次可以触发多少个并发请求,查看ThreadSafeClientConnManager的javadoc。如果池中没有更多的插槽,则进一步的请求将被阻止。
【解决方案2】:

HttpClient 是一个相当大且复杂的对象。您可能会在您的应用程序中进行数十次(或可能更多)http 调用。如果您为每个 http 请求创建一个新请求,您很快就会遇到内存问题,并且肯定会注意到垃圾收集速度变慢。

http 客户端是一个通用组件,可以帮助您进行 http 调用,只需重用它即可。没有太多的理由。

【讨论】:

  • 但是重用它有时会导致“SingleClientConnManager 的使用无效:连接仍然分配。”有什么好的设计模式?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-28
  • 2022-01-05
  • 2012-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-12
相关资源
最近更新 更多