<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                [TOC] ## ImageWorker ImageWorker 主要提供的就是 異步 和 緩存 ![](https://img.kancloud.cn/90/9b/909b03517bfc476008590ef5057cbaf3_469x464.png) ### ImageWorker類 這個是加載圖片的核心類,建議大家看源代碼從這個類看起。它的主要功能是從內存/磁盤緩存中加載圖片,或者是從網絡上下載。這里第一要使用緩存,第二從網絡上下載,必然要使用異步線程,所以這里從類圖中大家也可以看到它有兩個關聯類 BitmapWorkerTask(繼承自AsynTask)和ImageCache, 分別用來處理異步和緩存。 ImageWorker提供給外部的主要接口是loadImage方法 -?加載圖片,如果內存中有,直接加載。否則使用異步線程(BitmapWorkerTask)后臺加載 - 從磁盤或者是網絡上下載 ~~~ public void loadImage(Object data, ImageView imageView) {} ~~~ ### BitmapWorkerTask類 異步處理圖片 - 下載并綁定圖片 ### ImageCache類 圖片的緩存處理,這里使用了二級緩存: 內存和磁盤。這里從類圖也可以看到它有一個關聯類DiskLruCache。 ### ImageResizer類 繼承自ImageWorker,可能有的童鞋會問ImageWorker不是已經實現異步和緩存了嗎,這個類是干嘛的呢?這個主要是根據給定的大小對Image做調整。比如當圖片太大時,不能簡單的加載到內存,需要做大小調整處理。 這里對它的幾個主要接口說明一下: * setImageSize:設置圖片要調整的大小 * calculateInSampleSize:?計算縮放比例 - 根據原圖大小和要調整后的大小計算 * decodeSampledBitmapFrom\*\*\*:得到調整大小后的圖片,,這里好幾個方法,數據源不一樣而已,沒啥大區別。 ### ImageFetcher類 繼承自ImageResizer。從網絡下載圖片。這里要澄清一點,processBitmap在ImageWorker中是一個抽象方法,并沒有實現體,在本示例中,是在ImageFetcher中實現的。之所以這樣設計,是因為圖片的來源是不確定和可變的,有可能從網絡下載,有可能從本地數據庫獲取。 ## Universal-Image-Loader ![](https://img.kancloud.cn/6e/a3/6ea3bc91f020bd64998cbed8fea2fed6_1000x745.png) ![](https://img.kancloud.cn/6f/b5/6fb53f92a6631d1842ddbe6561dd76b5_630x1108.png) ## 內存緩存 ### LruCache LinkedHashMap 這個隊列到底是由誰來維護的, ![](https://img.kancloud.cn/15/59/15592490eaf8eb1f5bbc1872f433f182_739x390.png) LinkedHashMap 實際上就是hashMap + link 即map里的每個元素增加了前一個引用 和后一個引用 ### 其他內存緩存策略 #### 只使用的是強引用緩存? LruMemoryCache(這個類就是這個開源框架默認的內存緩存類,緩存的是bitmap的強引用,下面我會從源碼上面分析這個類) #### 使用強引用和弱引用相結合的緩存 UsingFreqLimitedMemoryCache(如果緩存的圖片總量超過限定值,先刪除使用頻率最小的bitmap) ~~~ private final Map<Bitmap, Integer> usingCounts = Collections.synchronizedMap(new HashMap<Bitmap, Integer>()); //value為使用次數 ~~~ LRULimitedMemoryCache(這個也是使用的lru算法,和LruMemoryCache不同的是,他緩存的是bitmap的弱引用) ~~~ private final Map<String, Bitmap> lruCache = Collections.synchronizedMap(new LinkedHashMap<String, Bitmap>(INITIAL_CAPACITY, LOAD_FACTOR, true)); ~~~ FIFOLimitedMemoryCache(先進先出的緩存策略,當超過設定值,先刪除最先加入緩存的bitmap) ~~~ private final List<Bitmap> queue = Collections.synchronizedList(new LinkedList<Bitmap>()); ~~~ LargestLimitedMemoryCache(當超過緩存限定值,先刪除最大的bitmap對象) ~~~ private final Map<Bitmap, Integer> valueSizes = Collections.synchronizedMap(new HashMap<Bitmap, Integer>()); //value為大小 ~~~ LimitedAgeMemoryCache(當 bitmap加入緩存中的時間超過我們設定的值,將其刪除) ~~~ private final Map<String, Long> loadingDates = Collections.synchronizedMap(new HashMap<String, Long>()); //value為時間戳 ~~~ #### 只使用弱引用緩存 WeakMemoryCache(這個類緩存bitmap的總大小沒有限制,唯一不足的地方就是不穩定,緩存的圖片容易被回收掉) ## 磁盤緩存 ### 獲取緩存地址 ~~~ public File getDiskCacheDir(Context context, String uniqueName) { String cachePath; if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()) || !Environment.isExternalStorageRemovable()) { cachePath = context.getExternalCacheDir().getPath(); } else { cachePath = context.getCacheDir().getPath(); } return new File(cachePath + File.separator + uniqueName); ~~~ 可以看到,當SD卡存在或者SD卡不可被移除的時候,就調用getExternalCacheDir()方法來獲取緩存路徑,否則就調用getCacheDir()方法來獲取緩存路徑。前者獲取到的就是 /sdcard/Android/data//cache 這個路徑,而后者獲取到的是 /data/data//cache 這個路徑。 ### 實際效果 ![](https://img.kancloud.cn/72/f6/72f67fdd50e07bfe9a5c6cf2a8948fa3_250x226.png) 緩存目錄有許多個文件名很長的文件,和一個journal文件,那個文件名很長的文件自然就是緩存的圖片了,因為是使用了MD5編碼來進行命名的。 journal記錄了操作,作為管理緩存的手段
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看