App網絡傳輸協議(Json、XML、protobuf)

【原文地址 點擊打開鏈接

轉載請標明出處:一片楓葉的專欄

上一篇文章中我們講解了如何在App中統計數據,其實現主要分爲兩種:使用第三方服務統計和自身實現數據統計。一般而言我們使用第三方統計服務已經可以很好的滿足我們的也無需求了,只有部分數據敏感型的App,由於其數據敏感性在app中實現數據統計服務是一個更好的選擇,更多關於App數據統計相關的內容可參考我的:Android產品研發(八)–>App數據統計

而本文將要介紹的是App的網絡傳輸協議。App與服務器交互就會涉及到信息的交換,而信息的交互就必然需要一套完整的數據協議。這裏首先需要明確一點的是什麼是網絡傳輸協議呢?這裏首先套用一段百度百科的定義:

網絡傳輸協議或簡稱爲傳送協議(Communications Protocol[1] ),是指計算機通信的共同語言。現在最普及的計算機通信爲網絡通信,所以“傳送協議”一般都指計算機通信的傳送協議,如TCP/IP、NetBEUI等。然而,傳送協議也存在於計算機的其他形式通信,例如,面向對象編程裏面對象之間的通信;操作系統內不同程序之間的消息,都需要有一個傳送協議,以確保傳信雙方能夠溝通無間。

簡單而言網絡傳輸協議就是App端與服務器端交互的時候約定好的內容格式。比如我們常見的Json格式,xml格式等,這些都是網絡傳輸協議,而現在在App開發中比較常見的網絡傳輸協議有三種:xmljsonprotobuf 

而我們下面將分別分析其各自的使用利弊以及解析方案。

- 網絡傳輸協議-XML

xml是一種最早的網絡傳輸協議,常見於Java web開發中,不單單作爲網絡層的參數協議,還常見於各種配置文件中,在移動開發中也常見但是已不是主流的網絡傳輸協議。

優點:可讀性強,解析方便; 
缺點:效率不高,資源消耗過大; 
解析方式:DOM解析,SAX解析,PULL解析;

(1)DOM解析: 
解析器讀入整個文檔,然後構建一個駐留內存的樹結構,然後代碼就可以使用 DOM 接口來操作這個樹結構。優點:整個文檔樹在內存中,便於操作;支持刪除、修改、重新排列等多種功能;缺點:將整個文檔調入內存(包括無用的節點),浪費時間和空間;使用場合:一旦解析了文檔還需多次訪問這些數據;硬件資源充足(內存、CPU) 
(2)SAX解析: 
SAX ,事件驅動型解析方式。當解析器發現元素開始、元素結束、文本、文檔的開始或結束等時,發送事件,程序員編寫響應這些事件的代碼,保存數據。優點:不用事先調入整個文檔,佔用資源少;SAX解析器代碼比DOM解析器代碼小,適於Applet,下載。缺點:不是持久的;事件過後,若沒保存數據,那麼數據就丟了;無狀態性;從事件中只能得到文本,但不知該文本屬於哪個元素;使用場合:Applet;只需XML文檔的少量內容,很少回頭訪問;機器內存少; 
(3)PULL解析: 
PULL解析方式是Android專門爲移動設備上解析XML文件而設計的一種解析方式,顯而易見的其更加適用於移動設備解析xml文件。Pull解析和Sax解析很相似,Pull解析和Sax解析不一樣的地方是pull讀取xml文件後觸發相應的事件調用方法返回的是數字還有pull可以在程序中控制想解析到哪裏就可以停止解析。

- 網絡傳輸協議-JSON

JSON是在移動端比較常見的網絡傳輸協議,它較xml格式更叫的簡單和“小”,因此比xml更適合移動端對流量和內存的控制。

優點:較XML格式更加小巧; 
缺點:傳輸效率也不是太別高,但相較於xml提高了很多; 
解析方式:Gson解析,JSONObject方式解析,FastJson解析

(1)Gson解析: 
Gson解析方式是Google開源的一套解析方式,通過提供的Gson jar包,通過靜態方法直接由字符串解析成Java對象,簡單方便。 
具體使用方法,可參考:Google Gson 使用簡介

(2)JSONObject解析: 
JSONObject在org.json下面的包中,其也是一個解析Json字符串的工具類,具體使用方式可參考:JSONObject與JSONArray的使用

(3)FastJson解析: 
FastJson是阿里巴巴開源的一個解析Json數據的類庫,能夠將json字符串解析成java對象。這裏有其介紹,英文水平不好就不獻醜了…

  • Provide best performance in server side and Android client.

  • Provide simple toJSONString() and parseObject() methods to convert Java objects to JSON and vice-versa

  • Allow pre-existing unmodifiable objects to be converted to and from JSON

  • Extensive support of Java Generics

  • Allow custom representations for objects

  • Support arbitrarily complex objects (with deep inheritance hierarchies and extensive use of generic types)

- 網絡傳輸協議-ProtoBuf

ProtoBuf是Google開源的一套二進制流網絡傳輸協議,它獨立於語言,獨立於平臺。google 提供了多種語言的實現:java、c#、c++、Go 和Python,每一種實現都包含了相應語言的編譯器以及庫文件。由於它是一種二進制的格式,比使用 xml 進行數據交換快許多。可以把它用於分佈式應用之間的數據通信或者異構環境下的數據交換。作爲一種效率和兼容性都很優秀的二進制數據傳輸格式,可以用於諸如網絡傳輸、配置文件、數據存儲等諸多領域。

優點:傳輸效率快(比xml和json快10-20倍),文檔型協議; 
缺點:使用不太方便;

這裏簡單解釋一下什麼是文檔型協議,向我們的xml和json一般在使用的時候都需要保存一份說明文檔和一個實際的java類,而protobuf在使用的時候其定義的格式就是說明文檔,簡單明瞭而且可以將其編譯成各個平臺的類庫,以java平臺爲例,其編程成jar之後,若定義文件發生了變化,則在使用jar包的話就會報錯,必須重新編譯,這也就保證了App端與服務器端的協議統一性。

網絡傳輸協議實踐

由於ProtoBuf的傳輸效率和文檔型協議的特性,公司產品選擇了Protobuf作爲網絡傳輸協議。下面我就以一個簡單的登錄操作,介紹一下對ProtoBuf的實際應用。

(1)定義ProtoBuf文件 
這裏寫圖片描述

(2)定義登錄網絡操作請求接口

<code class="hljs avrasm has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">// 提交短信驗證碼,如果該手機號碼沒有註冊過,則直接給用戶註冊
message SmsLogin {
    message Request {
        required string phone = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">; // 手機號碼</span>
        required string verifyCode = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">; // 驗證碼</span>
    }

    message Response {
        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">/*
         * 0:成功;-1:登錄失敗;-2:驗證碼錯誤;-3:驗證碼已經失效;-4:手機號碼格式不正確;-5:不是內測用戶不能登錄
         */</span>
        required int32 <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">ret</span> = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>
        optional <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">com</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.uu</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.facade</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.passport</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.pb</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.bean</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.UserAppSessionTicket</span> sessionTicket = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span>
        optional string phone = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">; // 手機號碼</span>
        optional string imgUrl = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">4</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">; // 用戶圖像url</span>
        optional <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">com</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.uu</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.facade</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.base</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.common</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.UserStatus</span> userStatus = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">5</span><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">; // 用戶狀態</span>
    }

}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; opacity: 0.119497; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li></ul>

可以看到在Protobuf中定義網絡請求,分爲兩個部分,請求部分和應答部分,其message request定義的是請求信息,而message response定義的是應答信息。 
請求信息中的字段就是我們請求中需要傳遞的字段,應答信息中的字段就是App端獲取的服務器端的應答信息集合。

每個字段都有修飾符,那麼修飾符是做什麼的呢? 
在protobuf中定義了三種修飾符,分別爲:required,optional,repeated。其中:

  • required:表示的是這個字段必須要傳遞,不可爲空;

  • optional:表示的是這個字段可傳可不傳,可以爲空;

  • repeated:表示這個字段傳遞的是列表數據

在message的定義過程中,message還可以嵌套另外的message信息,比如應答信息中的UserStatus,其和java中對象的概念很類似。

(3)將proto文件編譯成jar包 
這裏就不在具體介紹怎麼講proto文件編譯成jar了,google已經提供了相應的編譯工具。

(4)在Android代碼中使用 
由於我們將proto文件編譯成了jar包,首先我們需要將jar引入到我們的工程,然後就可以使用了。這裏簡單看一下具體的使用代碼。

<code class="hljs java has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-javadoc" style="color: rgb(136, 0, 0); box-sizing: border-box;">/**
     * 請求服務器短信登陸
     *
     *<span class="hljs-javadoctag" style="color: rgb(102, 0, 102); box-sizing: border-box;"> @param</span> phone
     *<span class="hljs-javadoctag" style="color: rgb(102, 0, 102); box-sizing: border-box;"> @param</span> code
     */</span>
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">private</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">requestSmsLogin</span>(String phone, String code) {
        showProgress(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">false</span>);<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 顯示進度條</span>
        LoginInterface.SmsLogin.Request.Builder request = LoginInterface.SmsLogin.Request.newBuilder();
        request.setPhone(phone); <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 設置手機號</span>
        request.setVerifyCode(code); <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 設置驗證碼</span>
        NetworkTask task = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> NetworkTask(Cmd.CmdCode.SmsLogin_SSL_VALUE);
        task.setBusiData(request.build().toByteArray());
        NetworkUtils.executeNetwork(task, <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> HttpResponse.NetWorkResponse<UUResponseData>() {
            <span class="hljs-annotation" style="color: rgb(155, 133, 157); box-sizing: border-box;">@Override</span>
            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">onSuccessResponse</span>(UUResponseData responseData) {
                <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (responseData.getRet() == <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>) {
                    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">try</span> {
                        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 顯示通用下發消息</span>
                        showResponseCommonMsg(responseData.getResponseCommonMsg());
                        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 解析請求應答信息</span>
                        LoginInterface.SmsLogin.Response response = LoginInterface.SmsLogin.Response.parseFrom(responseData.getBusiData());
                        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 判斷是否請求成功</span>
                        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (response.getRet() == <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>) {
                            ...doSomeThing()...
                        }
                    } <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">catch</span> (Exception e) {
                        e.printStackTrace();
                        showDefaultNetworkSnackBar();
                    }
                }
            }

            <span class="hljs-annotation" style="color: rgb(155, 133, 157); box-sizing: border-box;">@Override</span>
            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">onError</span>(VolleyError errorResponse) {
                showDefaultNetworkSnackBar();
            }

            <span class="hljs-annotation" style="color: rgb(155, 133, 157); box-sizing: border-box;">@Override</span>
            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">networkFinish</span>() {
                <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 取消進度條顯示</span>
                dismissProgress();
            }
        });
    }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; opacity: 0.119497; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li><li style="box-sizing: border-box; padding: 0px 5px;">40</li><li style="box-sizing: border-box; padding: 0px 5px;">41</li><li style="box-sizing: border-box; padding: 0px 5px;">42</li><li style="box-sizing: border-box; padding: 0px 5px;">43</li><li style="box-sizing: border-box; padding: 0px 5px;">44</li><li style="box-sizing: border-box; padding: 0px 5px;">45</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li><li style="box-sizing: border-box; padding: 0px 5px;">40</li><li style="box-sizing: border-box; padding: 0px 5px;">41</li><li style="box-sizing: border-box; padding: 0px 5px;">42</li><li style="box-sizing: border-box; padding: 0px 5px;">43</li><li style="box-sizing: border-box; padding: 0px 5px;">44</li><li style="box-sizing: border-box; padding: 0px 5px;">45</li></ul>

可以發現我們在代碼中直接有對應的登錄請求message類,這樣我們就可以直接通過java類調用了,O(∩_∩)O哈哈~。

總結:

本文主要介紹了App開發過程中常見了三種網絡傳輸協議,以及各自的優劣勢,還重點介紹了protobuf協議的使用方式等。大家在選擇的時候可以根據具體的產品需求來確定到底選擇哪一個,當然了這裏我還是比較推薦protobuf的。

另外對產品研發技術,技巧,實踐方面感興趣的同學可以參考我的: 
Android產品研發–>總結(持續更新) 
Android產品研發(一)–>實用開發規範 
Android產品研發(二)–>啓動頁優化 
Android產品研發(三)–>基類Activity 
Android產品研發(四)–>減小Apk大小 
Android產品研發(五)–>多渠道打包 
Android產品研發(六)–>Apk混淆 
Android產品研發(七)–>Apk熱修復 
Android產品研發(八)–>App數據統計


本文以同步至github中:https://github.com/yipianfengye/AndroidProject,歡迎star和follow


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章