1. 程式人生 > >Android中Okhttp和SPDY協議

Android中Okhttp和SPDY協議

  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通訊能顯著提升網路呼叫的效能。