您好我正在创建一个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请求是一种好习惯吗?
答案 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之前你需要记住。
答案 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}}