如果高效的加載圖片闽瓢?
減少圖片占用過多的內(nèi)存資源埃跷,防止內(nèi)存溢出。在展示高分辨率圖片的時候邮利,最好先將圖片進(jìn)行壓縮弥雹;使用圖片緩存;
高分辨率圖片如何壓縮延届?
BitmapFactory這個類提供了多個解析方法(decodeByteArray, decodeFile,decodeResource等)用于創(chuàng)建Bitmap對象剪勿,我們應(yīng)該根據(jù)圖片的來源選擇合適的方法。比如SD卡中的圖片可以使用decodeFile方法方庭,網(wǎng)絡(luò)上的圖片可以使用decodeStream方法厕吉,資源文件中的圖片可以使用decodeResource方法。這些方法會嘗試為已經(jīng)構(gòu)建的bitmap分配內(nèi)存械念,這時就會很容易導(dǎo)致OOM出現(xiàn)头朱。為此每一種解析方法都提供了一個可選的BitmapFactory.Options參數(shù),將這個參數(shù)的inJustDecodeBounds屬性設(shè)置為true就可以讓解析方法禁止為bitmap分配內(nèi)存龄减,返回值也不再是一個Bitmap對象项钮,而是null。雖然Bitmap是null了希停,但是BitmapFactory.Options的outWidth烁巫、outHeight和outMimeType屬性都會被賦值。這個技巧讓我們可以在加載圖片之前就獲取到圖片的長寬值和MIME類型宠能,從而根據(jù)情況對圖片進(jìn)行壓縮亚隙。如下代碼所示:
通過設(shè)置BitmapFactory.Options中inSampleSize的值就可以實(shí)現(xiàn)圖片壓縮。下面的方法可以根據(jù)傳入的寬和高违崇,計算出合適的inSampleSize值:
使用下面這個方法阿弃,首先你要將BitmapFactory.Options的inJustDecodeBounds屬性設(shè)置為true,解析一次圖片亦歉。然后將BitmapFactory.Options連同期望的寬度和高度一起傳遞到到calculateInSampleSize方法中恤浪,就可以得到合適的inSampleSize值了。之后再解析一次圖片肴楷,使用新獲取到的inSampleSize值水由,并把inJustDecodeBounds設(shè)置為false,就可以得到壓縮后的圖片了赛蔫。
下面的代碼非常簡單地將任意一張圖片壓縮成100*100的縮略圖砂客,并在ImageView上展示泥张。
如何緩存圖片?
內(nèi)存緩存技術(shù)對那些大量占用應(yīng)用程序?qū)氋F內(nèi)存的圖片提供了快速訪問的方法鞠值。其中最核心的類是LruCache (此類在android-support-v4的包中提供) 媚创。這個類非常適合用來緩存圖片,它的主要算法原理是把最近使用的對象用強(qiáng)引用存儲在 LinkedHashMap 中彤恶,并且把最近最少使用的對象在緩存值達(dá)到預(yù)設(shè)定值之前從內(nèi)存中移除钞钙。