歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Android開發實現HttpClient工具類

Android開發實現HttpClient工具類

日期:2017/3/1 11:08:10   编辑:Linux編程

在Android開發中我們經常會用到網絡連接功能與服務器進行數據的交互,為此Android的SDK提供了Apache的HttpClient來方便我們使用各種Http服務。你可以把HttpClient想象成一個浏覽器,通過它的API我們可以很方便的發出GET,POST請求(當然它的功能遠不止這些)。
  比如你只需以下幾行代碼就能發出一個簡單的GET請求並打印響應結果:

  try {
   // 創建一個默認的HttpClient
   HttpClient httpclient = new DefaultHttpClient();
   // 創建一個GET請求
   HttpGet request = new HttpGet("www.linuxidc.com");
   // 發送GET請求,並將響應內容轉換成字符串
   String response = httpclient.execute(request, new BasicResponseHandler());
   Log.v("response text", response);
   } catch (ClientProtocolException e) {
   e.printStackTrace();
   } catch (IOException e) {
   e.printStackTrace();
   }

  為什麼要使用單例HttpClient?
  這只是一段演示代碼,實際的項目中的請求與響應處理會復雜一些,並且還要考慮到代碼的容錯性,但是這並不是本篇的重點。注意代碼的第三行:

  HttpClient httpclient = new DefaultHttpClient();

  在發出HTTP請求前,我們先創建了一個HttpClient對象。那麼,在實際項目中,我們很可能在多處需要進行HTTP通信,這時候我們不需要為每個請求都創建一個新的HttpClient。因為之前已經提到,HttpClient就像一個小型的浏覽器,對於整個應用,我們只需要一個HttpClient就夠了。看到這裡,一定有人心裡想,這有什麼難的,用單例啊!!就像這樣:

  public class CustomerHttpClient {
   private static HttpClient customerHttpClient;

   private CustomerHttpClient() {
   }

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

  多線程!試想,現在我們的應用程序使用同一個HttpClient來管理所有的Http請求,一旦出現並發請求,那麼一定會出現多線程的問題。這就好像我們的浏覽器只有一個標簽頁卻有多個用戶,A要上linuxidc,B要上baidu,這時浏覽器就會忙不過來了。幸運的是,HttpClient提供了創建線程安全對象的API,幫助我們能很快地得到線程安全的“浏覽器”。

  解決多線程問題

  public class CustomerHttpClient {
   private static final String CHARSET = HTTP.UTF_8;
   private static HttpClient customerHttpClient;

   private CustomerHttpClient() {
   }

   public static synchronized HttpClient getHttpClient() {
   if (null == customerHttpClient) {
   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);
   /* 請求超時 */
   HttpConnectionParams.setSoTimeout(params, 4000);

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

   // 使用線程安全的連接管理來創建HttpClient
   ClientConnectionManager conMgr = new ThreadSafeClientConnManager(
   params, schReg);
   customerHttpClient = new DefaultHttpClient(conMgr, params);
   }
   return customerHttpClient;
   }
  }

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

Copyright © Linux教程網 All Rights Reserved