vollyソース解析(七)--最終目的のResponse

3359 ワード

前の記事では、最終的にはネットワークを通じて、HttpResonseオブジェクトを取得しました.
HttpResonseはandroidのカバンの中の一つです.そして、より高い拡張性のために、私達はBaicNetworkの中で見ました.VollyはVolly自身の対象となるNetwork Resonseに包装しました.
また、BaicNetwork類では、HttpResonseをNetwork Resonseに包装する過程で、HttpResonseのInputstreamを使って、データを1つのbyte[]配列に保存することにも注目しています.
BaicNetworkコードセグメント:
 // Some responses such as 204s do not have content.  We must check.  
                if (httpResponse.getEntity() != null) {//        
                  responseContents = entityToBytes(httpResponse.getEntity());//     byte[]    
                } else {//        
                  // Add 0 byte response as a way of honestly representing a  
                  // no-content request.  
                  responseContents = new byte[0];  
                }  
このようにすると、メモリが溢れ出すという問題があります.これもVollyが大きなファイルをダウンロードできない理由です.byte[]はメモリに保存されているからです.
はい、Network Resonseのソースコードを見てみましょう.
     /** 
     * The HTTP status code.
     * http    
     */
    public final int statusCode;

    /** 
     * Raw data from this response.
     *    
     */
    public final byte[] data;

    /** 
     * Response headers.
     *     
     */
    public final Map<String, String> headers;

    /** 
     * True if the server returned a 304 (Not Modified).
     *       .304 
     */
    public final boolean notModified;

    /** 
     * Network roundtrip time in milliseconds.
     *      
     */
    public final long networkTimeMs;

/**
     * Creates a new network response.
     * @param statusCode the HTTP status code
     * @param data Response body
     * @param headers Headers returned with this response, or null for none
     * @param notModified True if the server returned a 304 and the data was already in cache
     * @param networkTimeMs Round-trip network time to receive network response
     */
    public NetworkResponse(int statusCode, byte[] data, Map<String, String> headers,
            boolean notModified, long networkTimeMs) {
        this.statusCode = statusCode;
        this.data = data;
        this.headers = headers;
        this.notModified = notModified;
        this.networkTimeMs = networkTimeMs;
    }
本質的には特に何もありません.HttpResonseの内容をNetwork Resonseに簡単に移行します.
次に、配布に応答して、Network ResonseをReponse<T>オブジェクトに再包装することに責任を負います.
Network Displatchコードのセグメント:
// Parse the response here on the worker thread.          
                Response<?> response = request.parseNetworkResponse(networkResponse);
はどのように解析しますか?違うrequestは自分の実現があるべきです.
ここが見えるかもしれません.前のコードを見つけたからです.
前の解析では、私たちはいつもこれらのフラグメントを無視して、デフォルトはすべてResonseです.前の過程で、Resonseの違いを理解することはコアコードを理解することに迷惑をかけるので、スキップしました.
今ソース解析が終わりに近づいています.私たちは様々なレスリングを振り返ってみます.
httpStockはHttpResonseを獲得しました.HttpResonseはandroidの内蔵クラスですから、私達は使用がとても不便です.
上記の原因によって、私達はNetwork Resonseを持っています.これはVollyのカスタムクラスです.これは私達が使うと柔軟になります.さらに重要な点は、Network Resonseのbyte[]配列がネットワークデータを保存していることです.
最後に、すべてのResonseを統一するために、Network Resonse(理論的にもう一つのCacheResonse)をまたResonse<T>にカプセル化しました.
はい、Volly解析は基本的にここで終わります.次の文章では、Vollyの最後の部分のエピソードを紹介します.画像のロード部分について.
また、私は自分の理解によって、みんなを連れてVollyを改造して、もっと完璧な機能を持たせます.