Android 淺談HttpClient工具類

    在 Android開發中咱們常常會用到網絡鏈接功能與服務器進行數據的交互,爲此Android的SDK提供了Apache的 HttpClient來方便咱們使用各類Http服務。你能夠把 HttpClient想象成一個瀏覽器,經過它的API咱們能夠很方便的發出GET,POST請求(固然它的功能遠不止這些)。

  好比你只需如下幾行代碼就能發出一個簡單的GET請求並打印響應結果:

java代碼:
  1. try {
  2. // 建立一個默認的HttpClient
  3. HttpClient httpclient = new DefaultHttpClient();
  4. // 建立一個GET請求
  5. HttpGet request = new HttpGet("www.google.com");
  6. // 發送GET請求,並將響應內容轉換成字符串
  7. String response = httpclient.execute(request, new BasicResponseHandler());
  8. Log.v("response text", response);
  9. } catch (ClientProtocolException e) {
  10. e.printStackTrace();
  11. } catch (IOException e) {
  12. e.printStackTrace();
  13. }


複製代碼

       爲何要使用單例HttpClient

  這只是一段演示代碼,實際的項目中的請求與響應處理會複雜一些,而且還要考慮到代碼的容錯性,可是這並非本篇的重點。注意代碼的第三行:

   HttpClient httpclient = new DefaultHttpClient();

  在發出HTTP請求前,咱們先建立了一個HttpClient對象。那麼,在實際項目中,咱們極可能在多處須要進行HTTP通訊, 這時候咱們不須要爲每一個請求都建立一個新的HttpClient。由於以前已經提到,HttpClient就像一個小型的瀏覽器,對於整個應用,咱們只需 要一個HttpClient就夠了。看到這裏,必定有人內心想,這有什麼難的,用單例啊!!就像這樣:

java代碼:
  1. public class CustomerHttpClient {
  2. private static HttpClient customerHttpClient;

  3. private CustomerHttpClient() {
  4. }

  5. public static HttpClient getHttpClient() {
  6. if(null == customerHttpClient) {
  7. customerHttpClient = new DefaultHttpClient();
  8. }
  9. return customerHttpClient;
  10. }
  11. }


複製代碼

       多線程!試想,如今咱們的應用程序使用同一個 HttpClient來管理全部的Http請求,一旦出現 併發請求,那麼必定會出現多線程的問題。這就好像咱們的瀏覽器只有一個標籤頁卻有多個用戶,A要上google,B要上baidu,這時瀏覽器就會忙不過 來了。幸運的是,HttpClient提供了建立線程安全對象的API,幫助咱們能很快地獲得線程安全的「瀏覽器」。

   解決多線程問題

java代碼:
  1. public class CustomerHttpClient {
  2. private static final String CHARSET = HTTP.UTF_8;
  3. private static HttpClient customerHttpClient;

  4. private CustomerHttpClient() {
  5. }

  6. public static synchronized HttpClient getHttpClient() {
  7. if (null == customerHttpClient) {
  8. HttpParams params = new BasicHttpParams();
  9. // 設置一些基本參數
  10. HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
  11. HttpProtocolParams.setContentCharset(params,CHARSET);
  12. HttpProtocolParams.setUseExpectContinue(params, true);
  13. HttpProtocolParams.setUserAgent(
  14. params,"Mozilla/5.0(Linux;U;Android 2.2.1;en-us;Nexus One Build.FRG83) "
  15. + "AppleWebKit/553.1(KHTML,like Gecko) Version/4.0 Mobile Safari/533.1");
  16. // 超時設置
  17. /* 從鏈接池中取鏈接的超時時間 */
  18. ConnManagerParams.setTimeout(params, 1000);
  19. /* 鏈接超時 */
  20. HttpConnectionParams.setConnectionTimeout(params, 2000);
  21. /* 請求超時 */
  22. HttpConnectionParams.setSoTimeout(params, 4000);

  23. // 設置咱們的HttpClient支持HTTP和HTTPS兩種模式
  24. SchemeRegistry schReg = new SchemeRegistry();
  25. schReg.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
  26. schReg.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));

  27. // 使用線程安全的鏈接管理來建立HttpClient
  28. ClientConnectionManager conMgr = new ThreadSafeClientConnManager(params, schReg);
  29. customerHttpClient = new DefaultHttpClient(conMgr, params);
  30. }
  31. return customerHttpClient;
  32. }
  33. }


複製代碼

       在上面的getHttpClient()方法中,咱們爲HttpClient配置了一些基本參數和超時設置,而後使用ThreadSafeClientConnManager來建立線程安全的HttpClient。上面的代碼提到了3種超時設置,比較容易搞混,故在此特做辨析。 java



  在Android開發中咱們常常會用到網絡鏈接功能與服務器進行數據的交互,爲此Android的SDK提供了Apache的HttpClient來方便咱們使用各類Http服務。你能夠把HttpClient想象成一個瀏覽器,經過它的API咱們能夠很方便的發出GET,POST請求(固然它的功能遠不止這些)。

  好比你只需如下幾行代碼就能發出一個簡單的GET請求並打印響應結果:

java代碼:
android

  1. try {
  2. // 建立一個默認的HttpClient
  3. HttpClient httpclient = new DefaultHttpClient();
  4. // 建立一個GET請求
  5. HttpGet request = new HttpGet("www.google.com");
  6. // 發送GET請求,並將響應內容轉換成字符串
  7. String response = httpclient.execute(request, new BasicResponseHandler());
  8. Log.v("response text", response);
  9. } catch (ClientProtocolException e) {
  10. e.printStackTrace();
  11. } catch (IOException e) {
  12. e.printStackTrace();
  13. }


複製代碼

       爲何要使用單例HttpClient

  這只是一段演示代碼,實際的項目中的請求與響應處理會複雜一些,而且還要考慮到代碼的容錯性,可是這並非本篇的重點。注意代碼的第三行:

   HttpClient httpclient = new DefaultHttpClient();

  在發出HTTP請求前,咱們先建立了一個HttpClient對象。那麼,在實際項目中,咱們極可能在多處須要進行HTTP通訊, 這時候咱們不須要爲每一個請求都建立一個新的HttpClient。由於以前已經提到,HttpClient就像一個小型的瀏覽器,對於整個應用,咱們只需 要一個HttpClient就夠了。看到這裏,必定有人內心想,這有什麼難的,用單例啊!!就像這樣:

java代碼:
  1. public class CustomerHttpClient {
  2. private static HttpClient customerHttpClient;

  3. private CustomerHttpClient() {
  4. }

  5. public static HttpClient getHttpClient() {
  6. if(null == customerHttpClient) {
  7. customerHttpClient = new DefaultHttpClient();
  8. }
  9. return customerHttpClient;
  10. }
  11. }


複製代碼

       多線程!試想,如今咱們的應用程序使用同一個 HttpClient來管理全部的Http請求,一旦出現 併發請求,那麼必定會出現多線程的問題。這就好像咱們的瀏覽器只有一個標籤頁卻有多個用戶,A要上google,B要上baidu,這時瀏覽器就會忙不過 來了。幸運的是,HttpClient提供了建立線程安全對象的API,幫助咱們能很快地獲得線程安全的「瀏覽器」。

   解決多線程問題

java代碼:
  1. public class CustomerHttpClient {
  2. private static final String CHARSET = HTTP.UTF_8;
  3. private static HttpClient customerHttpClient;

  4. private CustomerHttpClient() {
  5. }

  6. public static synchronized HttpClient getHttpClient() {
  7. if (null == customerHttpClient) {
  8. HttpParams params = new BasicHttpParams();
  9. // 設置一些基本參數
  10. HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
  11. HttpProtocolParams.setContentCharset(params,CHARSET);
  12. HttpProtocolParams.setUseExpectContinue(params, true);
  13. HttpProtocolParams.setUserAgent(
  14. params,"Mozilla/5.0(Linux;U;Android 2.2.1;en-us;Nexus One Build.FRG83) "
  15. + "AppleWebKit/553.1(KHTML,like Gecko) Version/4.0 Mobile Safari/533.1");
  16. // 超時設置
  17. /* 從鏈接池中取鏈接的超時時間 */
  18. ConnManagerParams.setTimeout(params, 1000);
  19. /* 鏈接超時 */
  20. HttpConnectionParams.setConnectionTimeout(params, 2000);
  21. /* 請求超時 */
  22. HttpConnectionParams.setSoTimeout(params, 4000);

  23. // 設置咱們的HttpClient支持HTTP和HTTPS兩種模式
  24. SchemeRegistry schReg = new SchemeRegistry();
  25. schReg.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
  26. schReg.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));

  27. // 使用線程安全的鏈接管理來建立HttpClient
  28. ClientConnectionManager conMgr = new ThreadSafeClientConnManager(params, schReg);
  29. customerHttpClient = new DefaultHttpClient(conMgr, params);
  30. }
  31. return customerHttpClient;
  32. }
  33. }


複製代碼

       在上面的 getHttpClient()方法中,咱們爲HttpClient配置了一些基本參數和超時設置,而後使用 ThreadSafeClientConnManager來建立線程安全的HttpClient。上面的代碼提到了3種超時設置,比較容易搞混,故在此特做辨析。
相關文章
相關標籤/搜索