乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      volley完全解析

       昵稱38929306 2016-12-16

      一、volley是什么?

      1、簡(jiǎn)介

      Volley是Goole在2013年Google I/O大會(huì)上推出了一個(gè)新的網(wǎng)絡(luò)通信框架,它是開源的。從名字由來和配圖中無數(shù)急促的火箭可以看出 Volley 的特點(diǎn):特別適合數(shù)據(jù)量小,通信頻繁的網(wǎng)絡(luò)操作。(個(gè)人認(rèn)為 Android 應(yīng)用中絕大多數(shù)的網(wǎng)絡(luò)操作都屬于這種類型)。

      Volley加載圖片實(shí)現(xiàn)了兩級(jí)緩存(網(wǎng)絡(luò)緩存、文件緩存),沒有實(shí)現(xiàn)內(nèi)存的緩存。Volley已經(jīng)把各種異步任務(wù)、圖片采樣都封裝好了。內(nèi)存緩存使用lrucache類實(shí)現(xiàn),需要我們手動(dòng)添加進(jìn)去。沒有使用軟引用緩存。因?yàn)?.0之后的android系統(tǒng)已經(jīng)不推薦使用軟引用緩存了。

      2、volley的總體設(shè)計(jì)

      這里寫圖片描述

      這里寫圖片描述

      3、volley可以做什么

      JSON,圖像等的異步下載;
      處理get、post等網(wǎng)絡(luò)請(qǐng)求;
      網(wǎng)絡(luò)請(qǐng)求的排序(scheduling);
      網(wǎng)絡(luò)請(qǐng)求的優(yōu)先級(jí)處理;
      緩存;
      多級(jí)別取消請(qǐng)求;
      和Activity和生命周期的聯(lián)動(dòng)(Activity結(jié)束時(shí)同時(shí)取消所有網(wǎng)絡(luò)請(qǐng)求);
      等等。

      它的設(shè)計(jì)目標(biāo)就是非常適合去進(jìn)行數(shù)據(jù)量不大,但通信頻繁的網(wǎng)絡(luò)操作,而對(duì)于大數(shù)據(jù)量的網(wǎng)絡(luò)操作,比如說下載文件等,Volley的表現(xiàn)就會(huì)非常糟糕。

      二、圖片的三級(jí)緩存在volley中的實(shí)現(xiàn)

      其實(shí)volley可以完全取代我們手寫的三級(jí)緩存,因?yàn)間oogle已經(jīng)對(duì)volley進(jìn)行了非常好的封裝,具體說明如下:

      1、volley的推薦用法-單例模式

      使用volley時(shí),我們推薦把volley的使用封裝成單例使用。在application中初始化它。具體代碼如下:

      單例:

      package com.ht.xiangqu.util;import android.content.Context;import android.graphics.Bitmap;import android.support.v4.util.LruCache;import com.android.volley.RequestQueue;import com.android.volley.toolbox.ImageLoader;import com.android.volley.toolbox.Volley;/** * Created by annuo on 2015/6/16. */public class RequestManager { private static RequestManager ourInstance; private RequestQueue requestQueue; private ImageLoader imageLoader; public static RequestManager createInstance(Context context) { if (context != null) { if (ourInstance == null) { ourInstance = new RequestManager(context); } else { throw new IllegalArgumentException('Context must be set'); } } return ourInstance; } public static RequestManager getInstance() { return ourInstance; } private RequestManager(Context context) { requestQueue = Volley.newRequestQueue(context); imageLoader = new ImageLoader( requestQueue, new ImageLoader.ImageCache() { private LruCache cache = new LruCache<>(20); @Override public Bitmap getBitmap(String url) { return cache.get(url); } @Override public void putBitmap(String url, Bitmap bitmap) { cache.put(url, bitmap); } } ); } public RequestQueue getRequestQueue() { return requestQueue; } public ImageLoader getImageLoader() { return imageLoader; }}
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36
      • 37
      • 38
      • 39
      • 40
      • 41
      • 42
      • 43
      • 44
      • 45
      • 46
      • 47
      • 48
      • 49
      • 50
      • 51
      • 52
      • 53
      • 54
      • 55
      • 56
      • 57
      • 58
      • 59
      • 60
      • 61
      • 62
      • 63
      • 64
      • 65

      application:

      package com.ht.xiangqu.util;import android.app.Application;import android.util.Log;/** * Created by annuo on 2015/6/16. */public class MainApplation extends Application { @Override public void onCreate() { super.onCreate(); RequestManager.createInstance(getApplicationContext()); Log.d('nihao', 'nihao'); }}
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17

      2、內(nèi)存緩存

      只有加載圖片的時(shí)候才會(huì)有內(nèi)存緩存,對(duì)于字符串一般都是之后文件緩存。

      google并沒有自動(dòng)的幫我們實(shí)現(xiàn)內(nèi)存的緩存,需要我們自己手動(dòng)加入進(jìn)去。內(nèi)存緩存在單例類中已經(jīng)體現(xiàn)了(即LruCache),以后我們每次使用的時(shí)候都不必再加入內(nèi)存緩存。LruCache這個(gè)類是Android3.1版本中提供的,如果你是在更早的Android版本中開發(fā),則需要導(dǎo)入android-support-v4的jar包。

      3、文件緩存

      volley已經(jīng)默認(rèn)幫我們實(shí)現(xiàn)了文件的緩存。我們通過源代碼看一下:

      /** * Constructs a new ImageLoader. * @param queue The RequestQueue to use for making image requests. * @param imageCache The cache to use as an L1 cache. */ public ImageLoader(RequestQueue queue, ImageCache imageCache) { mRequestQueue = queue; mCache = imageCache; }
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10

      以上代碼是imageloader中的一段代碼,從中我們可以看到在構(gòu)造imageloader時(shí),我們已經(jīng)默認(rèn)的建立了一個(gè)L1級(jí)的緩存(文件緩存)。

      那volley緩存下來的文件到底在哪呢?見下圖:

      這里寫圖片描述

      具體的位置就在如圖所示的位置。即data/data/應(yīng)用程序的包名/volley,如果沒有修改volley的緩存位置,默認(rèn)名字叫volley。

      4、圖片的二次采樣的問題

      其實(shí)volley默認(rèn)的已經(jīng)幫我們做了圖片的二次采樣,只是需要我們?cè)谶M(jìn)行請(qǐng)求的時(shí)候,多加入兩個(gè)參數(shù)。我們一般都忽略了這個(gè)問題,最后導(dǎo)致的是不斷的OOM。

      /** * 這是訪問網(wǎng)絡(luò)圖片的核心方法 * @param requestUrl * @param imageListener * @param maxWidth * @param maxHeight * @return */ public ImageContainer get(String requestUrl, ImageListener imageListener, int maxWidth, int maxHeight) {
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      Request newRequest = new ImageRequest(requestUrl, new Listener() { @Override public void onResponse(Bitmap response) { onGetImageSuccess(cacheKey, response); } }, maxWidth, maxHeight, Config.RGB_565, new ErrorListener() { @Override public void onErrorResponse(VolleyError error) { onGetImageError(cacheKey, error); } }); mRequestQueue.add(newRequest); mInFlightRequests.put(cacheKey, new BatchedImageRequest(newRequest, imageContainer)); return imageContainer; }
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20

      以上代碼是imageloader的核心方法,其中有兩個(gè)參數(shù)是maxWidth,maxHeight,我們一般都忽略了這兩個(gè)參數(shù)。默認(rèn)值是0和0,這樣二次采樣算法就不起作用了,我們得到的圖片是從服務(wù)器1:1哪來的。但是一般我們?cè)O(shè)置了這兩個(gè)參數(shù),就可以得到我們希望的縮小比例的圖片。這樣就可以完全的避免OOM。

      三、volley的其他問題

      1、圓角圖片的問題

      public static ImageListener getImageListener(final ImageView view, final int defaultImageResId, final int errorImageResId) { return new ImageListener() { @Override public void onErrorResponse(VolleyError error) { if (errorImageResId != 0) { view.setImageResource(errorImageResId); } } @Override public void onResponse(ImageContainer response, boolean isImmediate) { if (response.getBitmap() != null) { //在這里可以設(shè)置,如果想得到圓角圖片的畫,可以對(duì)bitmap進(jìn)行加工,可以給imageview加一個(gè) //額外的參數(shù) view.setImageBitmap(response.getBitmap()); } else if (defaultImageResId != 0) { view.setImageResource(defaultImageResId); } } }; }
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23

      2、listview復(fù)用時(shí),解決圖片錯(cuò)位的問題

      /** * 使用此方法能夠解決圖片錯(cuò)亂問題 * @param view * @param defaultImageResId * @param errorImageResId * @param url * @return */ public static ImageListener getImageListener( final ImageView view, final int defaultImageResId, final int errorImageResId, final String url) { return new ImageListener() { @Override public void onErrorResponse(VolleyError error) { if (errorImageResId != 0) { view.setImageResource(errorImageResId); } } @Override public void onResponse(ImageContainer response, boolean isImmediate) { if (response.getBitmap() != null) { //在這里可以設(shè)置,如果想得到圓角圖片的畫,可以對(duì)bitmap進(jìn)行加工,可以給imageview加一個(gè) //額外的參數(shù) String urlTag = (String) view.getTag(); if(urlTag!=null && urlTag.trim().equals(url)){ view.setImageBitmap(response.getBitmap()); } } else if (defaultImageResId != 0) { view.setImageResource(defaultImageResId); } } }; }
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36
      • 37

      四、volley的具體用法

      關(guān)于這塊內(nèi)容,網(wǎng)絡(luò)上有很多的資料,總之volley使用起來非常的簡(jiǎn)單,感興趣的可以去網(wǎng)絡(luò)上查找相關(guān)的資料進(jìn)行學(xué)習(xí)。volley的加載速度絕對(duì)出乎你的意料。

      ——知道自己是誰,要什么,能跳多高,而且敢跳,并承受跳了可能失敗的所有結(jié)果。

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多