HttpClient請求服務器代碼優化版java
首先,我在前面的兩篇博文中介紹了在 Android中,除了使用java.net包下HttpUrlConnection的API訪問HTTP服務以外,咱們還能夠換一種途徑去完成工做。 Android SDK附帶了Apache的HttpClient API。Apache HttpClient是一個完善的HTTP客戶端,它提供了對HTTP協議的全面支持,可使用HTTP GET和POST進行訪問。那麼,如今咱們怎麼樣在android客戶端優化這些代碼呢? android
在前面介紹了怎麼使用HttpClient後,咱們須要考慮一個問題,在實際應用中,咱們不能每次都新建HttpClient,而是應該只爲整個app應 用建立一個HttpClient,並將其用於全部HTTP通訊。此外,還應該注意在經過一個HttpClient同時發出多個請求時可能發生的多線程問 題。針對這兩個問題,咱們須要改進一下咱們的項目,下面是這兩個問題的解決方案:apache
1.擴展系統默認的Application,並應用在項目中。(繼承系統的Application)安全
2.使用HttpClient類庫提供的ThreadSafeClientManager來建立和管理HttpClient。服務器
新建一個類MyApplication繼承系統的Application,代碼以下:
多線程
import org.apache.http.HttpVersion; import org.apache.http.client.HttpClient; import org.apache.http.client.params.HttpClientParams; import org.apache.http.conn.ClientConnectionManager; import org.apache.http.conn.params.ConnManagerParams; import org.apache.http.conn.scheme.PlainSocketFactory; import org.apache.http.conn.scheme.Scheme; import org.apache.http.conn.scheme.SchemeRegistry; import org.apache.http.conn.ssl.SSLSocketFactory; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager; import org.apache.http.params.BasicHttpParams; import org.apache.http.params.HttpConnectionParams; import org.apache.http.params.HttpParams; import org.apache.http.params.HttpProtocolParams; import android.app.Application; public class MyApplication extends Application { private HttpClient httpClient; @Override public void onCreate() { super.onCreate(); this.httpClient = this.createHttpClient();//app啓動時就建立一個HttpClient客戶端 } @Override public void onTerminate() { super.onTerminate(); this.shutdownHttpClient();//在app退出時候,關閉HttpClient客戶端 } @Override public void onLowMemory() { super.onLowMemory(); this.shutdownHttpClient();//在內存不足的時候,關閉HttpClient客戶端 } // 建立HttpClient實例 private HttpClient createHttpClient() { // 此處是創建一個HttpClient客戶端,包括配置參數 HttpParams params = new BasicHttpParams(); HttpClientParams.setRedirecting(params, true);// 設置是否能夠重定向 HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); HttpProtocolParams.setContentCharset(params, "Utf-8"); HttpProtocolParams.setHttpElementCharset(params, "UTF-8"); HttpConnectionParams.setConnectionTimeout(params, 5000); HttpConnectionParams.setSoTimeout(params, 3000); ConnManagerParams.setTimeout(params, 1000);// 從鏈接池中取鏈接的超時時間 // 根據本身須要設置 // ConnManagerParams.setMaxTotalConnections(params,200);//設置整個鏈接池最大鏈接數 // ,即總並行連接最大數 // ConnPerRoute connPerRoute = new ConnPerRouteBean(100);//每臺主機的最大並行連接數 // ConnManagerParams.setMaxConnectionsPerRoute(params,connPerRoute);//每臺主機的最大並行連接數 SchemeRegistry schreg = new SchemeRegistry(); schreg.register(new Scheme("http", PlainSocketFactory .getSocketFactory(), 80)); schreg.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443)); // 使用線程安全的鏈接管理來建立HttpClient ClientConnectionManager conman = new ThreadSafeClientConnManager( params, schreg); return new DefaultHttpClient(conman, params); } // 關閉鏈接管理器並釋放資源 private void shutdownHttpClient(){ if(httpClient != null && httpClient.getConnectionManager() != null){ httpClient.getConnectionManager().shutdown(); } } //提供公共方法對外使用 public HttpClient getHttpClient(){ return httpClient; } }
咱們重寫了onCreate()方法,在系統啓動時就建立一個HttpClient;重寫了onLowMemory()和onTerminate()方 法,在內存不足和應用結束時關閉鏈接,釋放資源。須要注意的是,當實例化DefaultHttpClient時,傳入一個由 ThreadSafeClientConnManager建立的一個ClientConnectionManager實例,負責管理HttpClient 的HTTP鏈接。app
而後,想要讓咱們這個增強版的「Application」生效,須要在AndroidManifest.xml中作以下配置:ide
<application android:name=".MyApplication" ...> ... </application>若是咱們沒有配置,系統默認會使用android.app.Application,咱們添加了配置,系統就會使用咱們的MyApplication,而後就能夠用
其實上面沒必要使用單例模式,由於app建立時候就只會執行一次onCreate方法,只會生成一個HttpClient客戶端。優化