android圖片釋放內存
市面上智能手機,都是內存一定的,有8G、16G、32G,但無論多少,內存總有一天會滿,像智能手機那樣,安裝的應用,會不斷產生緩存垃圾,加上一些圖片視頻,就這點小空間必然會不夠用。那麼掌握一些內存釋放技巧,就顯得重要了。
雖然安卓2.2系統開始已經支持Apps2SD功能,但是很多用戶使用後發現安卓2.2系統下仍然有很多應用程序無法安裝到SD卡,即可程序支持移動到SD卡,但是還會保留一部分系統文件和隱私文件在手機內存里。
另外還有一些程序像Widgets,動態壁紙和一些系統程序,如果安裝在SD卡根本無法正常工作,內存不足依然是讓很多用戶感到棘手的問題。
不過安卓作為一種優秀的移動操作系統,提供了幾種可以手機清理和釋放內存空間的辦法,我們總結了下面幾點希望可以幫助用戶解決燃眉之急。
一、刪除那些你從來不用或者很少使用的應用程序
這是很多用戶都會面對的問題,默默忍受著手機內存不足的報警,甚至犧牲系統性能,就是捨不得刪除那些從來不用或者極少使用的應用程序,這可能也是一種強迫症。
刪除這些程序你會發現手機從此海闊天空,而且你沒有任何損失。
二、移動所有可以移動的應用程序數據到SD卡
Android 2.2以上的系統的'支持安裝應用程序到SD卡,確保檢查所有你安裝的應用程序如果支持apps to SD卡功能一定要移動到SD卡,對於一些大型軟體特別是游戲程序節省的容量相當可觀。
不過一定要注意Widgets程序,捆綁Widgets的程序,以及動態壁紙程序和那些需要在後台運行並且和系統進行交互的應用程序不要移動到SD卡存儲,否則程序可能無法正常工作。
如果覺得每個程序單獨設置太麻煩,可以藉助Apps 2 SD和SDMove這樣的程序簡化。
對於那些動手能力比較強的用戶可以通過網上的教程設置應用程序默認安裝到SD卡,這樣就可以一勞永逸。
三、清理大型應用程序的緩存數據
1、通過清理程序的緩存文件,釋放的內存空間會讓你喜出望外
2、進入手機設置選項,選擇 設置>應用程序 >管理應用程序
3、按一下Menu鍵,選擇「按大小排序」選項(如果是Android 2.2手機先要選擇已下載標簽),然後就可以 按照應用程序大小排列所有手機安裝的應用程序
4、點擊一款列表中的應用程序,如果程序有緩存文件可以顯示大小,直接點擊「清除緩存」選項就可以釋放這些緩存文件占據的空間
5、有一些應用程序的緩存文件可能多達數MB,比如Google Maps,Market,瀏覽器和相冊程序,清理手機這幾個程序的緩存文件就可以釋放相當可觀的空間。
6、很多手機廠商都在旗下手機預裝了自己開發的UI程序,比如HTC Sense,MOTOBLUR等,如果你打算使用LaunherPro或者ADW這樣的launcher程序替代HTC Sense,你可以清理甚至刪除HTC Sense的數據文件,這個操作可以讓你的手機多出幾十MB空間。
7、另外Android Market還提供一些自動清除緩存文件的應用程序,比如Quick App Clean Cache這款收費軟體。
8、對於已經取得root許可權的手機用戶,可以從Market下載 CacheCleaner, CacheMate和MoveCache這些程序來快速方便的清除程序緩存文件。
B. Android 高效內存-圖片內存使用優化
內容整理自網路。
在做內存優化的時候,我們發現除了解決內存泄露問題,剩下的就只有想辦法減少真實的內存佔用。而在App中,大部分內存可能被我們圖片佔用了,所以減少圖片的內存佔用可以帶來直接的效果。本文就簡單介紹一張圖片到底佔用多少內存,我們先假設我們有一張圖片時** 600 * 800** 的,圖片佔用空間大小假設是** 100KB**。
圖片內存大小跟佔用空間大小有什麼關系?
佔用空間的大小不是圖片佔用內存的大小,一些初學者可能會誤解一下。佔用空間是在磁碟上佔用的空間,內存大小是載入到內存中佔用的內存大小。兩個只是單位是一樣的,本質不是一個概念。
一張圖片到底佔用多少內存呢?(ARGB_8888編碼)
1. 圖片佔用內存的計算公式: 圖片高度 * 圖片寬度 * 一個像素佔用的內存大小
2. 所以上面的圖片佔用內存是:**800 * 600 * 4 byte = 1875KB = 1.83M **
上面的計算公式中,為什麼是4byte呢?文章後面有總結哦
圖片所在目錄對內存的影響?
在Android中,圖片的存放目錄和手機的屏幕密度影響圖片最終的大小,舉個例子:
假設我們的圖片放到 xhdpi 目錄下,那麼我們本文中的圖片佔用的內存大小如下:
屏幕密度為2的設備:800 * 600 * 4byte = 1.83M
屏幕密度為3的設備:800 * 1.5 * 600 * 1.5 * 4byte = 1.83 * 2.25M =** 4.12M**
所以,計算圖片佔用內存大小的時候,要考慮圖片所在的目錄跟設備密度,這兩個因素其實影響的是圖片的高寬,android會對圖片進行拉升跟壓縮。
總結
1. 圖片確實很佔用內存,內存優化先考慮圖片內存佔用;
2. 一定要避免使用大圖片,這就是.9圖很有用的原因之一;
3. 圖片的大小對內存的影響是正比關系;
4. 本文只是簡單的告知讀者怎麼計算圖片的內存大小。
大圖: 440 * 336 小圖: 220 * 168 資源目錄: xhdpi
小圖的高寬都是大圖的1/2-->小圖是原圖的1/4
界面效果:
測試設備: Coolpad 8676-M01 5.1 density=2.0
測試前准備操作: 同一款設備,設置圖片前後多次調用gc直到內存短時間內保持穩定不再變化
內存使用情況: 下圖依次是 初始內存,大圖內存,小圖內存
大圖佔用內存: 11.23 MB - 10.66 MB = 0.57 MB
小圖佔用內存: 10.81 MB - 10.66 MB = 0.15 MB
大圖小圖內存關系: 0.15 MB * 4 = 0.60 MB 約等於 0.57 MB (這是統計工具的誤差,理論上就是相等的)
同樣的方式在另外一台設備小米4c上得到的結果如下:
測試設備: Xiaomi Mi-4c V8.2.1.0.LXKCNDL 5.1.1 density=3.0
大圖佔用內存: 13.22 MB - 11.95 MB = 1.27 MB
小圖佔用內存: 12.27 MB - 11.95 MB = 0.32 MB
大圖小圖內存關系: 0.32 MB * 4 = 1.28 MB 約等於 1.27 MB
結論: 由此可見大圖比小圖佔用更多的內存,圖片大小(解析度)與佔用內存成正比關系
備註: 圖片在硬碟上佔用的磁碟空間大小,與在內存中佔用的內存大小完全不一樣,不是一個概念,不要混淆
根據上文中圖片大小與內存的關系,可以更加深刻的理解Android中.9圖片的作用,它不但能減少apk的體積,還能減少圖片佔用內存。
有些時候我們根本不需要圖片,而是自己繪制背景,可以在自定義View的onDraw中繪制背景,當然最方便的還是使用系統的Drawable,繪制部分交給系統去完成。
下面測試圖片與Drawable的內存佔用對比
原始圖片大小: 482 * 482
界面效果:
測試設備: Xiaomi Mi-4c V8.2.1.0.LXKCNDL 5.1.1
測試前准備操作: 同一款設備,設置背景前後多次調用gc直到內存短時間內保持穩定不再變化
內存使用情況: 下圖依次是 初始內存,使用圖片佔用的內存,使用Drawable佔用的內存,使用onDraw繪制佔用的內存
使用圖片佔用內存: 13.97 MB - 11.97 MB = 2.00 MB
使用Drawable佔用內存: 11.97 MB - 11.97 MB = 0.00 MB (不會是0,有誤差,只是很少)
使用onDraw繪制佔用內存: 11.98 MB - 11.97 MB = 0.01 MB
結論: 繪制背景,或者使用系統提供Drawable作為背景,會大大減少內存佔用
Drawable參考資料:
Drawable實戰解析:Android XML shape 標簽使用詳解(apk瘦身,減少內存好幫手)
Android GradientDrawable(shape標簽定義)靜態使用和動態使用(圓角,漸變實現)
「讓你的圖片最小化」一節中描述的方法:使用盡可能小的圖,使用.9,自己繪制背景或者使用Drawable來繪制背景
載入大圖片時需要對圖片進行壓縮,使用等比例壓縮方法直接在內存中處理圖片
這樣做要注意的是,圖片質量會變差,inSampleSize設置的值越大,圖片質量就越差。
有時候我們取得一張圖片,也許只是為了獲得這個圖片的一些信息,比如圖片的width、height等信息,不需要顯示到界面上,這個時候我們可以不把圖片載入到內存中。
由於Android外層是使用java,而底層使用的是C語言為圖片對象分配的內存空間。所以我們的外部雖然看起來釋放了,但里層卻並不一定完全釋放了,我們使用完圖片後最好再釋放掉里層的內存空間。
RGB(ARGB)
RGB色彩模式是工業界的一種顏色標准,是通過對紅(R)、綠(G)、藍(B)三個顏色通道的變化以及它們相互之間的疊加來得到各式各樣的顏色的,RGB即是代表紅、綠、藍三個通道的顏色,這個標准幾乎包括了人類視力所能感知的所有顏色,是目前運用最廣的顏色系統之一。在Android中還有包含透明度Alpha的顏色模型,即ARGB。
YUV
YUV,分為三個分量,「Y」表示明亮度(Luminance或Luma),也就是灰度值;而「U」和「V」 表示的則是色度(Chrominance或Chroma),作用是描述影像色彩及飽和度,用於指定像素的顏色。
YUV的原理是把亮度與色度分離,研究證明,人眼對亮度的敏感超過色度。利用這個原理,可以把色度信息減少一點,人眼也無法查覺這一點。
主要用於電視系統以及模擬視頻領域,它將亮度信息(Y)與色彩信息(UV)分離,沒有UV信息一樣可以顯示完整的圖像,只不過是黑白的,這樣的設計很好地解決了彩色電視機與黑白電視的兼容問題
YUV的存儲中與RGB格式最大不同在於,RGB格式每個點的數據是連繼保存在一起的。即R,G,B是前後不間隔的保存在2-4byte空間中。而YUV的數據中為了節約空間,U,V分量空間會減小。每一個點的Y分量獨立保存,但連續幾個點的U,V分量是保存在一起的,(反正人眼一般也看不出區別).這幾個點合起來稱為macro-pixel, 這種存儲格式稱為Packed格式。另外一種存儲格式是把一幅圖像中Y,U,V分別用三個獨立的數組表示。這種模式稱為planar模式。
CMYK
CMYK也稱作印刷色彩模式,顧名思義就是用來印刷的。印刷四分色模式是彩色印刷時採用的一種套色模式,利用色料的三原色混色原理,加上黑色油墨,共計四種顏色混合疊加,形成所謂「全彩印刷」。四種標准顏色是:
CMYK和RGB相比有一個很大的不同:RGB模式是一種發光的色彩模式,你在一間黑暗的房間內仍然可以看見屏幕上的內容;CMYK是一種依靠反光的色彩模式,我們是怎樣閱讀報紙的內容呢?是由陽光或燈光照射到報紙上,再反射到我們的眼中,才看到內容。它需要有外界光源,如果你在黑暗房間內是無法閱讀報紙的。只要是在印刷品上看到的圖像,就是CMYK模式表現的。比如期刊、雜志、報紙、宣傳畫等,都是印刷出來的,那麼就是CMYK模式的了。
CMYK原色與疊加之後的顏色對比
在不考慮透明度的情況下,一個像素點的顏色值在計算機中的表示方法有以下3種:
在Java中,float類型的變數佔32位,int類型的變數佔32位,short和char類型的變數都在16位,因此可以看出,用浮點數表示法編碼一個像素的顏色,內存佔用量是96位即12位元組;而用24位整數表示法編碼,只要一個int類型變數,佔用4個位元組(高8位空著,低24位用於表示顏色);用16位整數表示法編碼,只要一個short類型變數,佔2個位元組;因此可以看出採用整數表示法編碼顏色值,可以大大節省內存,當然,顏色質量也會相對低一些。在Android中獲取Bitmap的時候一般也採用整型編碼。
回想一下Android的BitmapConfig類中,有ARGB_8888、ARGB_4444、RGB565等常量,現在可以知道它們分別代表了什麼含義。同時也可以計算一張圖片在內存中可能佔用的大小,比如採用ARGB_8888編碼載入一張1920 1200的圖片,大概就會佔用1920 1200*4/1024/1024=8.79MB的內存。
採用低內存佔用量的編碼方式,比如Bitmap.Config.ARGB_4444比Bitmap.Config.ARGB_8888更省內存;
1920 1200的圖片:*
ARGB_8888:1920 1200 4/1024/1024=8.79MB
ARGB_4444,RGB565:1920 1200 2/1024/1024=4.39MB
在Android中,對圖片的使用一定要關注,大多數情況下,佔用內存多,OOM發生都是因為圖片資源使用不當。不要盲目加一個大圖到Android項目中,能使用.9進來使用,而且.9圖本身盡可能小,另外能使用繪制實現就不要加一個圖片資源。有些時候,在不影響用戶體驗的情況下,可以降低圖片素材質量,比如不需要透明度的就不要了,有些透明度用肉眼看不出來。
C. 在android開發中載入的圖片太大,有好幾十兆,應該怎麼辦
如果圖片太大會造成OOM內存溢出的錯誤,需要用Bitmap的壓縮機制。
解決方案:
1.使用BitmapFactory.decodeStream替代createBitmap方法
原因是該方法直讀取圖片位元組,調用JNI>>nativeDecodeAsset()來完成decode,無需再使用java層的createBitmap。
2.使用壓縮讀取技術
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(imageSdUri, options);
final int height = options.outHeight;
final int width = options.outWidth;
options.inSampleSize = 1;
int w = 320;
int h = 480;
h = w*height/width;//計算出寬高等比率
int a = options.outWidth/ w;
int b = options.outHeight / h;
options.inSampleSize = Math.max(a, b);
options.inJustDecodeBounds = false;
Bitmap bitmap = BitmapFactory.decodeFile(imageSdUri, options);
3.及時釋放Bitamp
Bitmap對象在不使用時,我們應該先調用recycle()釋放內存,然後才它設置為null.雖然recycle()從源碼上看,調用它應該能立即釋放Bitmap的主要內存,但是測試結果顯示它並沒能立即釋放內存。但是我它應該還是能大大的加速Bitmap的主要內存的釋放。
D. 安卓手機的內存不足如何清理
安卓手機內存不足怎麼清理?很多時候,大家在使用手機安裝軟體或者其他操作時會出現手機內存不足。如果大家遇到這種問題該如何處理呢?下面,我就給大家講解一下安卓手機內存不足怎麼清理?希望能對大家有所幫助!
1)長按手機Home鍵,會彈出顯示手機正在後台運行的軟體,拖動去除或者點擊下方按鍵清理掉不需要後台運行的軟體。
2)打開系統管理軟體,這里以360手機衛士為例。點擊「需要大掃除了」(舊版名稱為手機清理),進去後點擊「一鍵清理」,或者也可在「內存優化」裏手動清理內存,以及「垃圾清理」里的垃圾文件。
華為手機
1、以華為手機為例,進入設置界面找到存儲管理。
2、進入後我們看到存儲使用狀態,先來對比一下清理前手機存儲情況,這里的多媒體文件就不說了,平時清理都是清理多媒體文件,這里有兩處地方佔用最大,應用程序和其他兩個地方。
3、回到設置界面,選擇應用和通知。
4、選擇應用管理。
5、來到程序管理界面,隨便找一個程序點擊。
6、點擊存儲。
7、我們看到佔用內存62M,點擊清理,這里清理後程序就恢復到最初安裝狀態,需要重新輸入賬戶和密碼。比如淘寶火山小視頻等等這些數據佔用相當大,我們根據自己的手機程序進行逐個刪除數據。
8、我們再回到存儲管理界面,看看應用程序已經降到15G左右,還有其他佔用基本沒變,這里的其他佔用是安卓系統生成的,不懂系統不能亂刪,沒有ROOT也刪除不了,所以要想刪除其他空間,只能恢復出廠設置。
拓展:
安卓手機內存總是不夠用的解決方法一
1、可以下載個網路或360的手機助手,用它的內存清理功能。一鍵清理,很方便;
2、不常用的軟體不要常駐內存,打開後按退出關掉,不要直接切換到主屏幕,這樣程序還是佔用內存的;
3、利用助手類管理軟體,將不要的自啟動軟體都禁止;
4、如果還是提示內存不足,則可能是你的手機檔次太低,內存過小,現在一般的主流安卓機都是2G的運行內存了,如果你的手機低於1G就太差了,要盡量避免同時打開多個程序。
安卓手機內存總是不夠用的`解決方法二
很多手機都已經有安裝到內存卡的功能了,大部分2.2操作系統以上的都可以自己選擇,如果不能選擇的話,就用電腦直接安到內存卡中即可。
點擊右上角的設置按鈕。
第二步,更改安裝目錄,將程序安裝到內存卡。
進入設置後,選擇安裝文件一欄,然後選擇優先將程序安裝到沒存卡。
清除手機內多餘的系統程序。
獲取root許可權,獲取許可權的方法有很多,我們可以到各大論壇進行學習,裡面教程有很多。因為不同的手機有不同的方法,不能一概而論,所以這里就不在介紹root的方法了。