在android開發中我們經常會用到網路連線功能與伺服器進行資料的互動,為此android的sdk提供了apache的httpclient來方便我們使用各種http服務。你可以把httpclient想象成乙個瀏覽器,通過它的api我們可以很方便的發出get,post請求(當然它的功能遠不止這些)。
比如你只需以下幾行**就能發出乙個簡單的get請求並列印響應結果:
try catch (clientprotocolexception e) catch (ioexception e)
這只是一段演示**,實際的專案中的請求與響應處理會複雜一些,並且還要考慮到**的容錯性,但是這並不是本篇的重點。注意**的第三行
在發出http請求前,我們先建立了乙個httpclient物件。那麼,
在實際專案中,我們很可能在多處需要進行http通訊,這時候我們不需要為每個請求都建立乙個新的httpclient
。因為之前已經提到,httpclient就像乙個小型的瀏覽器,對於整個應用,我們只需要乙個httpclient就夠了。看到這裡,一定有人心裡想,這有什麼難的,用單例啊!!就像這樣:
那麼,**不對勁呢?或者說做的還不夠完善呢?
多執行緒!試想,現在我們的應用程式使用同乙個httpclient來管理所有的http請求,一旦出現併發請求,那麼一定會出現多執行緒的問題。這就好像我們的瀏覽器只有乙個標籤頁卻有多個使用者,a要上google,b要上baidu,這時瀏覽器就會忙不過來了。幸運的是,httpclient提供了建立執行緒安全物件的api,幫助我們能很快地得到執行緒安全的「瀏覽器」。
在上面的gethttpclient()方法中,我們為httpclient配置了一些基本引數和超時設定,然後使用threadsafeclientconnmanager來建立執行緒安全的httpclient。上面的**提到了3種超時設定,比較容易搞混,故在此特作辨析。
* 從連線池中取連線的超時時間 */
connmanagerparams.settimeout(params, 1000);
/* 連線超時 */
/* 請求超時 */
第一行設定connectionpooltimeout:這定義了從connectionmanager管理的連線池中取出連線的超時時間,此處設定為1秒。
第二行設定connectiontimeout: 這定義了通過網路與伺服器建立連線的超時時間。httpclient包中通過乙個非同步執行緒去建立與伺服器的socket連線,這就是該socket連線的超時時間,此處設定為2秒。
第三行設定sockettimeout: 這定義了socket讀資料的超時時間,即從伺服器獲取響應資料需要等待的時間,此處設定為4秒。
以上3種超時分別會丟擲connectionpooltimeoutexception,connectiontimeoutexception與sockettimeoutexception。
// 建立post請求
// 傳送請求
現在,在整個專案中我們都能很方便的使用該工具類來進行網路通訊的業務**編寫了。下面的**演示了如何使用username和password註冊乙個賬戶並得到新賬戶id。
//準備資料
namevaluepair param1 =new basicnamevaluepair("username", "張三");
log.i(tag, "新使用者id:"+ resultid);
} catch (runtimeexception e) catch (exception e)
可以看到,使用工具類能大大提高在專案中編寫網路通訊**的效率。不過該工具類還有待完善,歡迎各位補充和矯正錯誤,希望最後能完成乙個工具類作為使用httpclient的最佳實踐。(完)
出處:
使用單例模式實現自己的HttpClient工具類
在android開發中我們經常會用到網路連線功能與伺服器進行資料的互動,為此android的sdk提供了apache的httpclient來方便我們使用各種http服務。你可以把httpclient想象成乙個瀏覽器,通過它的api我們可以很方便的發出get,post請求 當然它的功能遠不止這些 比如...
使用Qt實現單例模式
使用qt實現單例模式 場景描述 多個按鈕控制彈出同乙個對話方塊工具物件,任何一次更改都是對該物件的直接操作。考慮單例模式的適用場景 適用場景 由於單例模式的以上優點,所以是程式設計中用的比較多的一種設計模式。我總結了一下我所知道的適合使用單例模式的場景 單例模式的優點 使用的該類作為有狀態的工具類,...
單例模式的實現
單例設計模式保證類在記憶體中只存在乙個物件。根據不同的策略,單例類的實現有以下幾種方式。1.立即載入 在載入類的同時例項化物件,設計要點如下 1 私有化構造方法 2 宣告並例項化本類物件 靜態 3 提供公有靜態方法獲取物件。code 1 public class eagersingleton oth...