Android中Okhttp和SPDY協議
阿新 • • 發佈:2019-01-01
HTTP的一個問題在於每個連線一次只允許一個請求和響應,這就讓瀏覽器或者其他客戶端為了並行請求必須生成多個套接字(socket)連線。對客戶端來說,這不算什麼大問題,但是對伺服器來說情況就不一樣了,所以需要更新Http協議來解決這個問題。其結果就是SPDY協議,它允許一個套接字連線上傳送多個HTTP請求。該協議已成為下一代HTTP事實上的開放標準,但它不會取代http,而是改良瞭如何通過網路傳送請求和相應。
如果開發者同時開發客戶端和伺服器端程式碼,研究一下使用SPDY來代替常規的HTTP/1.1還是值得做的,SPDY能顯著降低網路負載,並能提高效能。主流瀏覽器已經能夠很好地支援SPDY,並且已經有多個平臺的實現版本了,其中就包括Android。
如果選擇SPDY作為通訊協議,建議使用OkHttp,目前已經開源,只要在Gradle中引入,只需要新增Maven依賴
compile 'com.squareup.okhttp:okhttp:1.1.1'
該第三方庫只是一個支援SPDY的改進的HTTP客戶端。它內部使用HttpUrlConnection介面,所以從現有程式碼切換到OkHttp只需要少量工作。
下面的程式碼展示瞭如何在Android中使用OkHttp庫:
public class OkHttpExample{ private final OkHttpClient mOkHttpClient; public OkHttpExample(){ mOkHttpClient = new OkHttpClient(); } public String okHttpDemo(URL url) throws IOEception{ HttpURLConnection urlConnection = mOkHttpClient.open(url); InputStream inputStream = null; urlConnection.setRequestMethod("GET"); urlConnection.connect; if(urlConnection.getResponseCode() == HttpURLConnection.HTTP_OK){ inputStream = urlConnection.getInputStream(); return readStreamToString(inputStream,urlConnection.getContentLength()); } return null; } private String readStreamToString(InputStream inputStream,int length)throws IOException{ try{ BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); StringBuilder stringBuilder = new StringBuilder(length); char[] buffer = new char[length]; int charsRead; while((charsRead = bufferedReader.read(buffer)) != -1){ stringBuilder.append(buffer,0,charsRead); } return stringBuilder.toString(); }finally{ inputStream.close(); } }
當建立OkHttpClient新例項時,它會初始化所有的東西,比如連線池和響應快取。即使是普通的Http請求,該實現也非常快,所以使用它來發送網路請求是個不錯的想法。使用OkHttp進行SPDY通訊能顯著提升網路呼叫的效能。