Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android的volley框架心得

Android的volley框架心得

編輯:關於Android編程

小弟很懶,不喜歡寫這些總結,主要是表達能力有限,如果想一起交流volley相關的,可以看看我的github Volley
大家一起學習進步
1. Volley中添加url參數和表單 請求中添加Url參數,需要自己拼接字符串,或者重寫getUrl方法
 StringBuilder sb = new StringBuilder();
        if (!url.contains("?")) {
            url = url + "?";
        } else {
            if (!url.endsWith("?")) {
                url = url + "&";
            }
        }
        Iterator iterotor = paramsMap.keySet().iterator();
        while (iterotor.hasNext()) {
            String key = (String) iterotor.next();
            try {
                sb.append(key).append("=").append(URLEncoder.encode(paramsMap.get(key), "utf-8")).append("&");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
        }
        if (sb.lastIndexOf("&") == sb.length() - 1) {
            sb.deleteCharAt(sb.length() - 1);
        }

post中添加參數 重寫Requst的getParams方法,或者自定義request
@Override
        protected Map getParams() throws AuthFailureError {
            ParamsEngine engine = new ParamsEngine(mContext);
            Map p = engine.generateRequestParams(paramsMap);
            return p;
        }


2. Volley加載本地圖片 Volley本身只能處理網絡請求,緩存網絡請求。但是其request和response的架構同樣適用於異步加載本地和本地文件。所有網絡請求的獲取,全部交給了BasicNetwork.它是Volley的核心,在performRequest這個方法中,將所有request轉換為相應的response,交給NetworkDispatcher來調度。我們只需要對request的url進行判斷。如果是/或者file開頭的,通通作為本地文件處理,使用本地解析流的方式放回response,同時把request中的shouldCahce設為false,因為本地文件已經存在本地,不再需要緩存到volley的緩存文件中,代碼如下:
 String urlString = request.getUrl();
            if(urlString.trim().toLowerCase().startsWith("file")){
                try {
                    // 如果加載的是本地圖片,不放入disk-cache目錄中
                    request.setShouldCache(false);
                    return new NetworkResponse(getFromFile(new URI(urlString).getPath()));
                } catch (URISyntaxException e) {
                    e.printStackTrace();
                }
            }else if(urlString.trim().toLowerCase().startsWith("/")){
                request.setShouldCache(false);
                return new NetworkResponse(getFromFile(urlString));
            }  

其中getFromFile方法,就是把file轉換成字節數組,可以參照volley中轉換entity的方法
private byte[] getFromFile(String urlString) throws IOException {
        File file = new File(urlString);
       
        PoolingByteArrayOutputStream bytes =
                new PoolingByteArrayOutputStream(mPool, (int) file.length());
        byte[] buffer = null;
        // 得到文件的輸入流
        InputStream in = null;
        try {
            buffer = mPool.getBuf(1024);
            in = new FileInputStream(new File(urlString));
            int count;
            while ((count = in.read(buffer)) != -1) {
                bytes.write(buffer, 0, count);
            }
            return bytes.toByteArray();
        } finally {
            if (in != null) {
                try {
                    in.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            mPool.returnBuf(buffer);
            try {
                bytes.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

這裡使用ByteArrayPool來避免反復申請byte[]數組空間
3. Volley中DiskBasedCache初始化非常慢的問題。 initialize方法中,遍歷所有的緩存文件,讀取頭信息存入map中,當緩存文件非常多的時候,google提供的初始化實現,耗費了10s以上的時間!!!不知道這是不是個bug。也就是說,每次newRequestQueue,都需要等待十秒的時間才能開始處理request。如果這樣的話,這個框架就沒法用了。 目前我也沒找到好的方法。有兩個優化方案。 (1) 有人在stackoverflow中提到過這個問題,然後他給出了解決方案。在initialize中,給FileOutputStream在套一層BufferedOutputStream。本人測試過,速度有十倍的提升。基本能控制初始化的時間在1-3s。 (2) 提前初始化。每一次newRequestQueue都要花費這麼長時間初始化,但是實際使用中,我們需要new那麼多RequestQueue嗎?看源代碼可以知道,每個RequestQueue實際啟動了5個循環線程來調度各種請求。其中四個用來處理網絡請求,一個用來處理cache請求。對於一個app來說,這樣已經足夠,我們沒必要每個頁面都啟動一個RequestQueue。因此,我把RequestQueue設置為單例,在Application中初始化,這樣就可以避免initialize被反復調用,同時也能在界面出來之前,預先准備好數據
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved