APP開(kāi)發(fā)如何內(nèi)存優(yōu)化實(shí)操解決方法,深圳APP開(kāi)發(fā)公司提醒各位APP開(kāi)發(fā)愛(ài)好者,我們?cè)贏PP項(xiàng)目制作時(shí)如果不解決內(nèi)存優(yōu)化問(wèn)題,對(duì)我們后期程序運(yùn)行會(huì)存在著許多問(wèn)題,本文就與各位分享如何節(jié)省內(nèi)存,以下是一些節(jié)省內(nèi)存的方法。
(1)當(dāng)UI不可見(jiàn)時(shí),釋放相關(guān)資源。在Activity的onPause()方法中停止動(dòng)畫(huà)、停止視頻播放、停止獲取和傳遞設(shè)備當(dāng)前的經(jīng)緯度給服務(wù)器等。在Activity的onStop()方法中取消當(dāng)前界面的網(wǎng)絡(luò)請(qǐng)求等。在onTrimMemory()方法中,接收到TRIM_MEMORY_UI_HIDDEN信號(hào)時(shí)釋放UI使用的內(nèi)存資源,如圖片占據(jù)的內(nèi)存,這樣減少內(nèi)存消耗,也可避免被系統(tǒng)回收此APP使用的內(nèi)存。
注意:onTrimMemory()方法中的TRIM_MEMORY_UI_HIDDEN回調(diào)只有當(dāng)程序中的所有UI組件全部不可見(jiàn)的時(shí)候才會(huì)觸發(fā),這和onStop()方法還是有很大區(qū)別的,onStop()方法只是當(dāng)一個(gè)Activity完全不可見(jiàn)的時(shí)候調(diào)用,比如說(shuō)用戶打開(kāi)了程序中的另一個(gè)Activity??梢栽趏nStop()方法中去釋放一些Activity相關(guān)的資源,如取消網(wǎng)絡(luò)連接或者注銷(xiāo)廣播接收器等,但是像UI相關(guān)的資源應(yīng)該一直要等到onTrimMemory(TRIM_MEMORY_UI_HIDDEN)這個(gè)回調(diào)之后才去釋放,這樣可以保證如果用戶只是從程序的一個(gè)Activity回到了另外一個(gè)Activity,界面相關(guān)的資源都不需要重新加載,從而提升響應(yīng)速度。
(2)在解碼JPG、PNG和GIF等格式的圖片時(shí),通過(guò)設(shè)置圖片位數(shù)可以有效減少使用的內(nèi)存。如Glide中默認(rèn)的圖片解碼位數(shù)是32位,也就是用4個(gè)字節(jié)描述一個(gè)像素點(diǎn)的數(shù)據(jù)。
publicstaticfinalDecodeFormatDEFAULT=PREFER_ARGB_8888
當(dāng)APP檢測(cè)到當(dāng)前可用的內(nèi)存少或屏幕的分辨率低時(shí),可以降低圖片的質(zhì)量,就是降低圖片的位數(shù),如設(shè)置成PREFER_RGB_565,用2個(gè)字節(jié)描述一個(gè)像素的數(shù)據(jù),這樣消耗的內(nèi)存少了一半。
(3)內(nèi)存緊張時(shí)釋放資源。對(duì)于運(yùn)行中的程序,如果內(nèi)存緊張,會(huì)在onTrimMemory(intlevel)回調(diào)方法中接收到以下級(jí)別的信號(hào)。TRIM_MEMORY_RUNNING_MODERATE:系統(tǒng)可用內(nèi)存較低,正在殺掉LRU緩存中的進(jìn)程。而當(dāng)前進(jìn)程正在運(yùn)行,沒(méi)有被殺掉的危險(xiǎn)。
TRIM_MEMORY_RUNNING_LOW:系統(tǒng)可用內(nèi)存更加緊張,程序雖然暫沒(méi)有被殺死的危險(xiǎn),但是應(yīng)該盡量釋放一些資源,以提升系統(tǒng)的性能(這也會(huì)直接影響程序的性能)。TRIM_MEMORY_RUNNING_CRITICAL:系統(tǒng)內(nèi)存極度緊張,而LRU緩存中的大部分進(jìn)程已被殺死,如果仍然無(wú)法獲得足夠的資源的話,接下來(lái)會(huì)清理掉LRU中的所有進(jìn)程,并且開(kāi)始?xì)⑺酪恍┫到y(tǒng)通常會(huì)保留的進(jìn)程,比如后臺(tái)運(yùn)行的服務(wù)等。當(dāng)程序未在運(yùn)行,并保留在LRU(Least-RecentlyUsed)緩存中時(shí),在onTrimMemory(intlevel)中會(huì)返回以下級(jí)別的信號(hào)。TRIM_MEMORY_BACKGROUND:系統(tǒng)可用內(nèi)存低,而程序處在LRU的頂端,因此暫時(shí)不會(huì)被殺死,但是此時(shí)應(yīng)釋放一些程序再次打開(kāi)時(shí)比較容易恢復(fù)的UI資源。TRIM_MEMORY_MODERATE:系統(tǒng)可用內(nèi)存低,程序處于LRU的中部位置,如果內(nèi)存狀態(tài)得不到緩解,程序會(huì)有被殺死的可能。TRIM_MEMORY_COMPLETE:系統(tǒng)可用內(nèi)存低,程序處于LRU尾部,如果系統(tǒng)仍然無(wú)法回收足夠的內(nèi)存資源,程序?qū)⑹紫缺粴⑺?。此時(shí)應(yīng)釋放無(wú)助于恢復(fù)程序狀態(tài)的所有資源。
(4)不要在執(zhí)行頻率很高的方法或者循環(huán)中創(chuàng)建對(duì)象,可以使用HashTable等創(chuàng)建一組對(duì)象容器,從容器中取那些對(duì)象,而不用每次new與釋放。
(5)在代碼中正式集成三方庫(kù)時(shí),最好要對(duì)庫(kù)使用的內(nèi)存進(jìn)行評(píng)估。
(6)使用Android系統(tǒng)提供的優(yōu)化過(guò)的數(shù)據(jù)結(jié)構(gòu)。如SparseArray、SparseBooleanArray和LongSparseArray等,相比Java提供的HashMap,這些數(shù)據(jù)結(jié)構(gòu)更節(jié)省內(nèi)存。
(7)少用枚舉變量,按Google官方文檔的說(shuō)法,枚舉類(lèi)型變量的內(nèi)存消耗常比靜態(tài)常量的2倍還多。
(8)盡量少使用static類(lèi)型變量。static類(lèi)型變量的生命周期其實(shí)是和APP的生命周期是一樣的。大量使用的話,就會(huì)導(dǎo)致大量?jī)?nèi)存無(wú)法被釋放,容易出現(xiàn)內(nèi)存不足的情況。
(9)使用View緩存。在ListView和GridView中,列表中的很多項(xiàng)(convertView)是可以重用的,不需要每次調(diào)用getView方法都重新申請(qǐng)一次內(nèi)存。
(10)當(dāng)有較多的字符串需要拼接的時(shí)候,推薦使用StringBuffer類(lèi)。(11)開(kāi)啟線程數(shù)量不易過(guò)多,一般與(機(jī)器內(nèi)核數(shù)+1)一樣最好,推薦開(kāi)啟線程的時(shí)候使用線程池。
(12)在加載網(wǎng)絡(luò)圖片的時(shí)候,使用軟引用或者弱引用并進(jìn)行本地緩存。
(13)慎用多進(jìn)程,一個(gè)不執(zhí)行任何任務(wù)的空進(jìn)程至少也要占用1.4MB內(nèi)存。(14)盡可能地復(fù)用資源,如Android系統(tǒng)本身有很多字符串、顏色、圖片、動(dòng)畫(huà)、樣式以及簡(jiǎn)單布局等資源可以
直接使用,同時(shí)要盡量復(fù)用style等資源以達(dá)到節(jié)約內(nèi)存。
(15)盡量?jī)?yōu)化的代碼,減少冗余代碼。Java中每個(gè)類(lèi)(包括匿名內(nèi)部類(lèi))都占用至少500字節(jié)左右的代碼。
(16)少用強(qiáng)引用,多用軟引用或弱引用。好了,APP開(kāi)發(fā)公司本文關(guān)于“APP開(kāi)發(fā)如何內(nèi)存優(yōu)化實(shí)操解決方法”就分享到這里,謝謝關(guān)注,博納網(wǎng)絡(luò)編輯整理。