android中可以用两种方式去实现Http请求,一种是通过HttpURLConnection另外一种是HttpClient,现在来说说这两个类的用法,以及我常用的一种Http请求的代码:

HttpURLConnection

继承关系如下:

java.lang.Object
java.net.URLConnection
java.net.HttpURLConnection

通过官方文档的描述,我们可以通过URL.openConnection()来得到一个HttpURLConnection的对象,通过这个对象我们可以获取打开这个URL连接后的数据,用到的方法如getInputStream() 或 getOutputStream()或getHeaderFields() 或setReadTimeout() 或setConnectTimeout()等等等,这里要非常强调的是,默认情况下,这里的http请求时get方式,如果要把这个http请求设置成post方式的话,需要setDoOutput(true),当不用这个Http请求对象时,执行disconnect()即可释放这个请求资源。


HttpClient

它是一个接口,其子类有AbstractHttpClient、AndroidHttpClient、DefaultHttpClient,但是一般来说,我都使用的是HttpClient这个接口,用子类来初始化它。一般是写一个单例类,因为大家都这么写,精通android3一书中也是这么讲解的,如下

public class MyHttpClient {private static final String CHARSET = HTTP.UTF_8;private static HttpClient mClient ;private MyHttpClient(){}public static synchronized HttpClient getInstance(){if(null == mClient){HttpParams params = new BasicHttpParams();HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);HttpProtocolParams.setContentCharset(params, CHARSET) ;HttpProtocolParams.setUseExpectContinue(params, true);HttpProtocolParams.setUserAgent(params, "Mozilla/5.0(Linux;U;Android 2.2.1;en-us;Nexus One Build.FRG83) "                        +"AppleWebKit/553.1(KHTML,like Gecko) Version/4.0 Mobile Safari/533.1");ConnManagerParams.setTimeout(params, 1000);//从连接池中取连接超时的超时时间HttpConnectionParams.setConnectionTimeout(params, 2000);// http连接超时HttpConnectionParams.setSoTimeout(params, 4000);// 请求超时时间SchemeRegistry schReg = new SchemeRegistry();schReg.register(new Scheme("http",SSLSocketFactory.getSocketFactory(),80));schReg.register(new Scheme("https",SSLSocketFactory.getSocketFactory(),443));// 使用线程安全来连接管理创建HttpClient对象ClientConnectionManager conManager = new ThreadSafeClientConnManager(params,schReg);mClient = new DefaultHttpClient(conManager,params);}return mClient ;}public static synchronized void closeHttpClient() {    if(mClient != null) {    mClient.getConnectionManager().shutdown();    mClient = null;    }    }}
在用的时候:

public void connectBaiDu(){HttpClient client = MyHttpClient.getInstance();try {URI uri = new URI("http://www.baidu.com");HttpGet get = new HttpGet(uri);HttpResponse response = client.execute(get); int statusCode = response.getStatusLine().getStatusCode() ;if(statusCode != HttpStatus.SC_OK ){return ;}Header[] headers = response.getAllHeaders();for(Header header : headers){Log.e("",header.getName() + " : " + header.getValue());}InputStream in = response.getEntity().getContent();if(null == in){Log.e("", "in is null");return ;}BufferedReader reader = new BufferedReader(new InputStreamReader(in));String line = "" ;while(null != (line = reader.readLine())){Log.e("line = ",line);}} catch (Exception e) {Log.e("","exception");e.printStackTrace();}finally{MyHttpClient.closeHttpClient();}}
通过单例模式获取一个实例,并且执行HttpGet对象,可以从官方文档中看到,execute方法可以执行很多种的http请求,包括HttpGet,HttpPost,HttpHost,HttpUriRequest等等
比较这两种方式,当一个应用程序需要很多http请求的时候,使用HttpURLConntection时,http设置或赋初值过于分散,修改是件麻烦事,没有使用HttpClient方便。当然,你的HttpURLConnection也可以写成单例模式,但是你得传入一个URL才能初始化它,相对于HttpClient来说的话类的封装上就差一些,甚至于没有必要那样去写。这里要看项目有多大,使用http访问的多不多,多的话,使用HttpClient构成单例类,要好点。使用的少的话,使用HttpURLConnection要好点。






更多相关文章

  1. Android中滑屏初探 ---- scrollTo 以及 scrollBy方法使用说明
  2. Android异步网络请求框架-Volley
  3. 【Android】从无到有:手把手一步步教你使用最简单的 Fragment(一)
  4. Android(安卓)之 ServiceManager与服务管理
  5. Android的三种网络通信方式
  6. 设置Activity全屏
  7. 箭头函数的基础使用
  8. NPM 和webpack 的基础使用
  9. Python list sort方法的具体使用

随机推荐

  1. Intent的Action实现应用程序之间的切换
  2. 8、NFC技术:让Android自动打开网页
  3. android自定义属性
  4. Android(安卓)studio: Gradle sync faile
  5. iphone/android比较学习之──图片、文件
  6. [Android] Android下实现电话号码归属地
  7. ZXing
  8. Android SDK Manager不显示更新问题的解
  9. Android(安卓)让adb以root的身份来运行
  10. 推荐一个Android颜色选择器的库colorpick