volley源碼分析

適用范圍

由于數(shù)據(jù)解析和暫存,都是存儲(chǔ)在內(nèi)存中,所以不適合下載大件。

請(qǐng)求流程

  • 創(chuàng)建請(qǐng)求隊(duì)列
  • 構(gòu)建HTTP請(qǐng)求
  • 添加請(qǐng)求到隊(duì)列
image

JSON

String url = "http://my-json-feed";

JsonObjectRequest jsonObjectRequest = new JsonObjectRequest
        (Request.Method.GET, url, null, new Response.Listener<JSONObject>() {

    @Override
    public void onResponse(JSONObject response) {
        textView.setText("Response: " + response.toString());
    }
}, new Response.ErrorListener() {

    @Override
    public void onErrorResponse(VolleyError error) {
        // TODO: Handle error

    }
});

// Access the RequestQueue through your singleton class.
MySingleton.getInstance(this).addToRequestQueue(jsonObjectRequest);

ByteArrayPool

使用LRU算法達(dá)到緩存byte[] 目的,減少GC開銷

public class ByteArrayPool {
    /** 這是一個(gè)按照時(shí)間排序的回收隊(duì)列,便于回收 */
    private final List<byte[]> mBuffersByLastUse = new ArrayList<>();

    /** 這是一個(gè)按照內(nèi)存塊大小排序的回收隊(duì)列,便于查找 */
    private final List<byte[]> mBuffersBySize = new ArrayList<>(64);

    /** 內(nèi)存池當(dāng)前大小*/
    private int mCurrentSize = 0;

    /** 最大尺寸限制 */
    private final int mSizeLimit;

    /** 根據(jù)內(nèi)存尺寸進(jìn)行排列 */
    protected static final Comparator<byte[]> BUF_COMPARATOR =
            new Comparator<byte[]>() {
                @Override
                public int compare(byte[] lhs, byte[] rhs) {
                    return lhs.length - rhs.length;
                }
            };

    /** 通過(guò)設(shè)置大小,來(lái)創(chuàng)建內(nèi)存池 */
    public ByteArrayPool(int sizeLimit) {
        mSizeLimit = sizeLimit;
    }

    /**
      獲取一塊內(nèi)存
     */
    public synchronized byte[] getBuf(int len) {
        for (int i = 0; i < mBuffersBySize.size(); i++) {
            byte[] buf = mBuffersBySize.get(i);
            if (buf.length >= len) {
                mCurrentSize -= buf.length;
                mBuffersBySize.remove(i);
                mBuffersByLastUse.remove(buf);
                return buf;
            }
        }
        return new byte[len];
    }

    /**
     回收一塊內(nèi)存
     */
    public synchronized void returnBuf(byte[] buf) {
        if (buf == null || buf.length > mSizeLimit) {
            return;
        }
        mBuffersByLastUse.add(buf);
        int pos = Collections.binarySearch(mBuffersBySize, buf, BUF_COMPARATOR);
        if (pos < 0) {
            pos = -pos - 1;
        }
        mBuffersBySize.add(pos, buf);
        mCurrentSize += buf.length;
        trim();
    }

    /** 移除內(nèi)存塊,直到達(dá)到尺寸要求 */
    private synchronized void trim() {
        while (mCurrentSize > mSizeLimit) {
            byte[] buf = mBuffersByLastUse.remove(0);
            mBuffersBySize.remove(buf);
            mCurrentSize -= buf.length;
        }
    }
}

待續(xù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 我的博客: Volley 源碼分析 Volley 的使用流程分析 官網(wǎng)示例 創(chuàng)建一個(gè)請(qǐng)求隊(duì)列 RequestQue...
    realxz閱讀 2,054評(píng)論 1 11
  • 前言 本文是一篇日常學(xué)習(xí)總結(jié)性的文章,筆者通過(guò)分析經(jīng)典網(wǎng)絡(luò)框架Volley的源碼,望以鞏固Android網(wǎng)絡(luò)框架中...
    Armstrong_Q閱讀 585評(píng)論 0 7
  • 概述 Volley是Google推出的一款比較輕巧的網(wǎng)絡(luò)請(qǐng)求框架,并且可以對(duì)請(qǐng)求進(jìn)行緩存,同時(shí)可以實(shí)時(shí)取消請(qǐng)求,設(shè)...
    wustor閱讀 470評(píng)論 0 1
  • volley中的所有請(qǐng)求都是抽象類Request的具體實(shí)現(xiàn)類 public abstract class Requ...
    _warren閱讀 315評(píng)論 0 1
  • 1. 問(wèn)題 在 AppHost.framework【注1】(以下簡(jiǎn)稱 AppHost) 的編碼中,需要處理很多預(yù)先...
    hite和落雁閱讀 4,825評(píng)論 0 6