Singleton HttpClient for android应用程序

时间:2014-05-25 16:58:43

标签: java android http httprequest

您好我正在创建一个Android应用程序,我需要调用Web API,我可以使用这些库,如volley等,但我不是在寻找。

为了执行我的任务,我将HttpClient设为单身,以便为每个http调用使用相同的httpClient。一旦http请求完成,我从不关闭连接,因为如果我关闭httpClient,那么我必须得到它的另一个实例。

CustomHttpClient.java

private static HttpClient httpClient;

public static HttpClient getHttpClient() {
    if(httpClient == null) {
        httpClient = new DefaultHttpClient();
    }
    return httpClient;
}

NetworkHelper.java

public static InputStream getInputStreamFromUrl(String url) {
    InputStream content = null;
    try {
        HttpClient httpclient = CustomHttpClient.getHttpClient();
        HttpResponse response = httpclient.execute(new HttpGet(url));
        content = response.getEntity().getContent();
    } catch (Exception e) {
        Log.("Demo", "Network exception", e);
    }
    return content;
}

请帮助我这样调用http请求是一种好习惯吗?

3 个答案:

答案 0 :(得分:2)

我认为您正在寻找的是在AndroidHttpClient类中实现的alerady。我用过它,效果非常好。您可以像使用HttpClient一样使用它。只需使用newInstance方法即可。

AndroidHttpClient httpClient = AndroidHttpClient.newInstance(null);

要防止创建InputStream content = null;的许多实例,可以将其设置为实现getInputStreamFromUrl方法的类的某个私有变量,将返回类型更改为解析响应的对象,只需关闭InputStream,您就不需要反复初始化。你可以这样做:

private static InputStream content = null;
private AndroidHttpClient httpclient = AndroidHttpClient.newInstance(null);

public static YourType getInputStreamFromUrl(String url) {

    try {
        YourType yourCustomType = new YourType();           
        HttpResponse response = httpclient.execute(new HttpGet(url));
        content = response.getEntity().getContent();

        //Parse response to YourType object here

        content.close();
    } catch (Exception e) {
        Log.("Demo", "Network exception", e);
    }
    return yourCustomType;
}

答案 1 :(得分:2)

根据apache,建议每个通信组件或每个应用程序都有一个HttpClient实例。

但是在实现这样的Singleton HttpClient之前你需要记住。

  1. 确保使用线程在后台进行所有下载,不要使用UI线程。
  2. 维护所有下载请求的队列。所有这些请求都需要排队并一个接一个地运行。
  3. 如果在清除HttpClient队列之前切换活动,则应清除队列,以便它不会开始加载新活动的组件。
  4. 一切都完成后关闭客户端。

答案 2 :(得分:1)

这不是一个糟糕的解决方案,但它并不好。这是原因

1)官方推荐:

  

通常建议每个通信组件或每个应用程序都有一个HttpClient实例

2)AndroidHttpClient与您正在做的相同,但它不是单独实现的。

3)您可以在AndroidHttpClient finalize中看到如果连接无法关闭@Override protected void finalize() throws Throwable { super.finalize(); if (mLeakedException != null) { Log.e(TAG, "Leak found", mLeakedException); mLeakedException = null; } } 方法说它非常糟糕

public static InputStream getInputStreamFromUrl(String url) {
    InputStream content = null;
    try {
        HttpClient httpclient = AndroidHttpClient.newInstance();
        HttpResponse response = httpclient.execute(new HttpGet(url));
        content = response.getEntity().getContent();
        httpclient.close();
    } catch (Exception e) {
        Log.("Demo", "Network exception", e);
    }
    return content;
}

<强>更新

我想我会像下面那样使用它

{{1}}