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的三种网络通信方式
  2. android存取数据方式:文件、SharedPreferences
  3. Android解析XML文件的三种方式
  4. android5中数据存储方式详解
  5. Android期末项目(一)—— 解析二维数组对象
  6. Android 4.0 SDK的离线方式安装
  7. Android 关于WebView加载完成的多种监听方式
  8. android 4种存储方式
  9. Android中的四种启动方式

随机推荐

  1. andorid RecyclerView下拉刷新,上拉加载更
  2. android键盘的监听
  3. Android(安卓)编译环境下常用命令
  4. Android(安卓)Toast
  5. Android(安卓)签名信息读取
  6. Android低功耗蓝牙(BLE)随笔(二)
  7. Android(安卓)intent跳转工具类
  8. zz Android(安卓)HTML5 video play
  9. android中的spinner
  10. Android参数设置父布局集体宽高