Android最佳性能實(shí)踐(一)——合理管理內(nèi)存

有不少朋友都問過我呜叫,怎樣才能寫出高性能的應(yīng)用程序,如何避免程序出現(xiàn)OOM服赎,或者當(dāng)程序內(nèi)存占用過高的時候該怎么樣去排查掘宪。確實(shí),一個優(yōu)秀的應(yīng)用程序,不僅僅要功能完成得好,性能問題也應(yīng)該處理得恰到好處。為此驼唱,我也是閱讀了不少Android官方給出的高性能編程建議,那么從本篇文章開始驹暑,我就準(zhǔn)備開始寫一個全新系列的博文玫恳,來把這些建議進(jìn)行整理和分析,幫助大家能夠?qū)懗龈映錾膽?yīng)用程序优俘。

注意本系列文章的內(nèi)容基本源于Android Doc京办,如果想要閱讀更加詳細(xì)的關(guān)于性能方面的資料,可以直接去閱讀Android官方文檔帆焕。

內(nèi)存(RAM)對于任何一個軟件開發(fā)環(huán)境都是種非常珍貴的資源惭婿,而對于移動操作系統(tǒng)來講的話,則會顯得更加珍貴叶雹,因?yàn)槭謾C(jī)的硬件條件相對于PC畢竟是比較落后的财饥。盡管Android系統(tǒng)的虛擬機(jī)擁有自動回收垃圾的機(jī)制,但這并不代表我們就可以忽視應(yīng)該在什么時候分配和釋放內(nèi)存折晦。

為了使垃圾回收器可以正常釋放程序所占用的內(nèi)存钥星,在編寫代碼的時候就一定要注意盡量避免出現(xiàn)內(nèi)存泄漏的情況(通常都是由于全局成員變量持有對象引用所導(dǎo)致的),并且在適當(dāng)?shù)臅r候去釋放對象引用满着。對于大多數(shù)的應(yīng)用程序而言打颤,后面其它的事情就可以都交給垃圾回收器去完成了,如果一個對象的引用不再被其它對象所持有漓滔,那么系統(tǒng)就會將這個對象所分配的內(nèi)存進(jìn)行回收。

我們在開發(fā)軟件的時候應(yīng)當(dāng)自始至終都把內(nèi)存的問題充分考慮進(jìn)去乖篷,這樣的話才能開發(fā)出更加高性能的軟件响驴。而內(nèi)存問題也并不是無規(guī)律可行的,Android系統(tǒng)給我們提出了很多內(nèi)存優(yōu)化的建議技巧撕蔼,只要按照這些技巧來編寫程序豁鲤,就可以讓我們的程序在內(nèi)存性能發(fā)面表現(xiàn)得相當(dāng)不錯秽誊,下面我們就來一一學(xué)習(xí)一下這些技巧。

節(jié)制地使用Service

如果應(yīng)用程序當(dāng)中需要使用Service來執(zhí)行后臺任務(wù)的話琳骡,請一定要注意只有當(dāng)任務(wù)正在執(zhí)行的時候才應(yīng)該讓Service運(yùn)行起來锅论。另外,當(dāng)任務(wù)執(zhí)行完之后去停止Service的時候楣号,要小心Service停止失敗導(dǎo)致內(nèi)存泄漏的情況最易。

當(dāng)我們啟動一個Service時,系統(tǒng)會傾向于將這個Service所依賴的進(jìn)程進(jìn)行保留炫狱,這樣就會導(dǎo)致這個進(jìn)程變得非常消耗內(nèi)存藻懒。并且,系統(tǒng)可以在LRU cache當(dāng)中緩存的進(jìn)程數(shù)量也會減少视译,導(dǎo)致切換應(yīng)用程序的時候耗費(fèi)更多性能嬉荆。嚴(yán)重的話,甚至有可能會導(dǎo)致崩潰酷含,因?yàn)橄到y(tǒng)在內(nèi)存非常吃緊的時候可能已無法維護(hù)所有正在運(yùn)行的Service所依賴的進(jìn)程了鄙早。

為了能夠控制Service的生命周期,Android官方推薦的最佳解決方案就是使用IntentService椅亚,這種Service的最大特點(diǎn)就是當(dāng)后臺任務(wù)執(zhí)行結(jié)束后會自動停止限番,從而極大程度上避免了Service內(nèi)存泄漏的可能性。關(guān)于IntentService更加詳細(xì)的用法講解什往,可以參考《第一行代碼——Android》的9.5.2節(jié)扳缕。

讓一個Service在后臺一直保持運(yùn)行,即使它并不執(zhí)行任何工作别威,這是編寫Android程序時最糟糕的做法之一躯舔。所以Android官方極度建議開發(fā)人員們不要過于貪婪,讓Service在后臺一直運(yùn)行省古,這不僅可能會導(dǎo)致手機(jī)和程序的性能非常低下粥庄,而且被用戶發(fā)現(xiàn)了之后也有可能直接導(dǎo)致我們的軟件被卸載(我個人就會這么做)。

當(dāng)界面不可見時釋放內(nèi)存

當(dāng)用戶打開了另外一個程序豺妓,我們的程序界面已經(jīng)不再可見的時候惜互,我們應(yīng)當(dāng)將所有和界面相關(guān)的資源進(jìn)行釋放。在這種場景下釋放資源可以讓系統(tǒng)緩存后臺進(jìn)程的能力顯著增加琳拭,因此也會讓用戶體驗(yàn)變得更好训堆。

那么我們?nèi)绾尾拍苤莱绦蚪缑媸遣皇且呀?jīng)不可見了呢?其實(shí)很簡單白嘁,只需要在Activity中重寫onTrimMemory()方法坑鱼,然后在這個方法中監(jiān)聽TRIM_MEMORY_UI_HIDDEN這個級別,一旦觸發(fā)了之后就說明用戶已經(jīng)離開了我們的程序絮缅,那么此時就可以進(jìn)行資源釋放操作了鲁沥,如下所示:

[java]view plaincopy

@Override

publicvoidonTrimMemory(intlevel)?{

super.onTrimMemory(level);

switch(level)?{

caseTRIM_MEMORY_UI_HIDDEN:

//?進(jìn)行資源釋放操作

break;

}

}

注意onTrimMemory()方法中的TRIM_MEMORY_UI_HIDDEN回調(diào)只有當(dāng)我們程序中的所有UI組件全部不可見的時候才會觸發(fā)呼股,這和onStop()方法還是有很大區(qū)別的,因?yàn)閛nStop()方法只是當(dāng)一個Activity完全不可見的時候就會調(diào)用画恰,比如說用戶打開了我們程序中的另一個Activity彭谁。因此,我們可以在onStop()方法中去釋放一些Activity相關(guān)的資源允扇,比如說取消網(wǎng)絡(luò)連接或者注銷廣播接收器等缠局,但是像UI相關(guān)的資源應(yīng)該一直要等到onTrimMemory(TRIM_MEMORY_UI_HIDDEN)這個回調(diào)之后才去釋放,這樣可以保證如果用戶只是從我們程序的一個Activity回到了另外一個Activity蔼两,界面相關(guān)的資源都不需要重新加載甩鳄,從而提升響應(yīng)速度。

當(dāng)內(nèi)存緊張時釋放內(nèi)存

除了剛才講的TRIM_MEMORY_UI_HIDDEN這個回調(diào)额划,onTrimMemory()方法還有很多種其它類型的回調(diào)妙啃,可以在手機(jī)內(nèi)存降低的時候及時通知我們。我們應(yīng)該根據(jù)回調(diào)中傳入的級別來去決定如何釋放應(yīng)用程序的資源:

TRIM_MEMORY_RUNNING_MODERATE表示應(yīng)用程序正常運(yùn)行俊戳,并且不會被殺掉揖赴。但是目前手機(jī)的內(nèi)存已經(jīng)有點(diǎn)低了,系統(tǒng)可能會開始根據(jù)LRU緩存規(guī)則來去殺死進(jìn)程了抑胎。

TRIM_MEMORY_RUNNING_LOW表示應(yīng)用程序正常運(yùn)行燥滑,并且不會被殺掉。但是目前手機(jī)的內(nèi)存已經(jīng)非常低了阿逃,我們應(yīng)該去釋放掉一些不必要的資源以提升系統(tǒng)的性能铭拧,同時這也會直接影響到我們應(yīng)用程序的性能。

TRIM_MEMORY_RUNNING_CRITICAL表示應(yīng)用程序仍然正常運(yùn)行恃锉,但是系統(tǒng)已經(jīng)根據(jù)LRU緩存規(guī)則殺掉了大部分緩存的進(jìn)程了搀菩。這個時候我們應(yīng)當(dāng)盡可能地去釋放任何不必要的資源,不然的話系統(tǒng)可能會繼續(xù)殺掉所有緩存中的進(jìn)程破托,并且開始?xì)⒌粢恍┍緛響?yīng)當(dāng)保持運(yùn)行的進(jìn)程肪跋,比如說后臺運(yùn)行的服務(wù)。

以上是當(dāng)我們的應(yīng)用程序正在運(yùn)行時的回調(diào)土砂,那么如果我們的程序目前是被緩存的州既,則會收到以下幾種類型的回調(diào):

TRIM_MEMORY_BACKGROUND表示手機(jī)目前內(nèi)存已經(jīng)很低了,系統(tǒng)準(zhǔn)備開始根據(jù)LRU緩存來清理進(jìn)程萝映。這個時候我們的程序在LRU緩存列表的最近位置吴叶,是不太可能被清理掉的,但這時去釋放掉一些比較容易恢復(fù)的資源能夠讓手機(jī)的內(nèi)存變得比較充足序臂,從而讓我們的程序更長時間地保留在緩存當(dāng)中蚌卤,這樣當(dāng)用戶返回我們的程序時會感覺非常順暢,而不是經(jīng)歷了一次重新啟動的過程。

TRIM_MEMORY_MODERATE表示手機(jī)目前內(nèi)存已經(jīng)很低了造寝,并且我們的程序處于LRU緩存列表的中間位置,如果手機(jī)內(nèi)存還得不到進(jìn)一步釋放的話吭练,那么我們的程序就有被系統(tǒng)殺掉的風(fēng)險(xiǎn)了诫龙。

TRIM_MEMORY_COMPLETE表示手機(jī)目前內(nèi)存已經(jīng)很低了,并且我們的程序處于LRU緩存列表的最邊緣位置鲫咽,系統(tǒng)會最優(yōu)先考慮殺掉我們的應(yīng)用程序签赃,在這個時候應(yīng)當(dāng)盡可能地把一切可以釋放的東西都進(jìn)行釋放。

避免在Bitmap上浪費(fèi)內(nèi)存

當(dāng)我們讀取一個Bitmap圖片的時候分尸,有一點(diǎn)一定要注意锦聊,就是千萬不要去加載不需要的分辨率。在一個很小的ImageView上顯示一張高分辨率的圖片不會帶來任何視覺上的好處箩绍,但卻會占用我們相當(dāng)多寶貴的內(nèi)存孔庭。需要僅記的一點(diǎn)是,將一張圖片解析成一個Bitmap對象時所占用的內(nèi)存并不是這個圖片在硬盤中的大小材蛛,可能一張圖片只有100k你覺得它并不大圆到,但是讀取到內(nèi)存當(dāng)中是按照像素點(diǎn)來算的,比如這張圖片是1500*1000像素卑吭,使用的ARGB_8888顏色類型芽淡,那么每個像素點(diǎn)就會占用4個字節(jié),總內(nèi)存就是1500*1000*4字節(jié)豆赏,也就是5.7M挣菲,這個數(shù)據(jù)看起來就比較恐怖了。

至于如何去壓縮圖片掷邦,以及更多在圖片方面節(jié)省內(nèi)存的技術(shù)白胀,大家可以去參考我之前寫的一篇博客Android高效加載大圖、多圖解決方案耙饰,有效避免程序OOM纹笼。

使用優(yōu)化過的數(shù)據(jù)集合

Android API當(dāng)中提供了一些優(yōu)化過后的數(shù)據(jù)集合工具類,如SparseArray苟跪,SparseBooleanArray廷痘,以及LongSparseArray等,使用這些API可以讓我們的程序更加高效件已。傳統(tǒng)Java API中提供的HashMap工具類會相對比較低效笋额,因?yàn)樗枰獮槊恳粋€鍵值對都提供一個對象入口,而SparseArray就避免掉了基本數(shù)據(jù)類型轉(zhuǎn)換成對象數(shù)據(jù)類型的時間篷扩。

知曉內(nèi)存的開支情況

我們還應(yīng)當(dāng)清楚我們所使用語言的內(nèi)存開支和消耗情況兄猩,并且在整個軟件的設(shè)計(jì)和開發(fā)當(dāng)中都應(yīng)該將這些信息考慮在內(nèi)。可能有一些看起來無關(guān)痛癢的寫法枢冤,結(jié)果卻會導(dǎo)致很大一部分的內(nèi)存開支鸠姨,例如:

使用枚舉通常會比使用靜態(tài)常量要消耗兩倍以上的內(nèi)存,在Android開發(fā)當(dāng)中我們應(yīng)當(dāng)盡可能地不使用枚舉淹真。

任何一個Java類讶迁,包括內(nèi)部類、匿名類核蘸,都要占用大概500字節(jié)的內(nèi)存空間巍糯。

任何一個類的實(shí)例要消耗12-16字節(jié)的內(nèi)存開支,因此頻繁創(chuàng)建實(shí)例也是會一定程序上影響內(nèi)存的客扎。

在使用HashMap時祟峦,即使你只設(shè)置了一個基本數(shù)據(jù)類型的鍵,比如說int徙鱼,但是也會按照對象的大小來分配內(nèi)存宅楞,大概是32字節(jié),而不是4字節(jié)疆偿。因此最好的辦法就是像上面所說的一樣咱筛,使用優(yōu)化過的數(shù)據(jù)集合。

謹(jǐn)慎使用抽象編程

許多程序員都喜歡各種使用抽象來編程杆故,認(rèn)為這是一種很好的編程習(xí)慣迅箩。當(dāng)然,這一點(diǎn)不可否認(rèn)处铛,因?yàn)榈某橄蟮木幊谭椒ǜ用嫦驅(qū)ο笏乔鳎以诖a的維護(hù)和可擴(kuò)展性方面都會有所提高。但是撤蟆,在Android上使用抽象會帶來額外的內(nèi)存開支奕塑,因?yàn)槌橄蟮木幊谭椒ㄐ枰帉戭~外的代碼,雖然這些代碼根本執(zhí)行不到家肯,但是卻也要映射到內(nèi)存當(dāng)中龄砰,不僅占用了更多的內(nèi)存,在執(zhí)行效率方面也會有所降低讨衣。當(dāng)然這里我并不是提倡大家完全不使用抽象編程换棚,而是謹(jǐn)慎使用抽象編程,不要認(rèn)為這是一種很酷的編程方式而去肆意使用它反镇,只在你認(rèn)為有必要的情況下才去使用固蚤。

盡量避免使用依賴注入框架

現(xiàn)在有很多人都喜歡在Android工程當(dāng)中使用依賴注入框架,比如說像Guice或者RoboGuice等歹茶,因?yàn)樗鼈兛梢院喕恍?fù)雜的編碼操作夕玩,比如可以將下面的一段代碼:

[java]view plaincopy

classAndroidWayextendsActivity?{

TextView?name;

ImageView?thumbnail;

LocationManager?loc;

Drawable?icon;

String?myName;

publicvoidonCreate(Bundle?savedInstanceState)?{

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

name??????=?(TextView)?findViewById(R.id.name);

thumbnail?=?(ImageView)?findViewById(R.id.thumbnail);

loc???????=?(LocationManager)?getSystemService(Activity.LOCATION_SERVICE);

icon??????=?getResources().getDrawable(R.drawable.icon);

myName????=?getString(R.string.app_name);

name.setText("Hello,?"+?myName?);

}

}

簡化成這樣的一種寫法:

[java]view plaincopy

@ContentView(R.layout.main)

classRoboWayextendsRoboActivity?{

@InjectView(R.id.name)?????????????TextView?name;

@InjectView(R.id.thumbnail)????????ImageView?thumbnail;

@InjectResource(R.drawable.icon)???Drawable?icon;

@InjectResource(R.string.app_name)?String?myName;

@InjectLocationManager?loc;

publicvoidonCreate(Bundle?savedInstanceState)?{

super.onCreate(savedInstanceState);

name.setText("Hello,?"+?myName?);

}

}

看上去確實(shí)十分誘人你弦,我們甚至可以將findViewById()這一類的繁瑣操作全部省去了。但是這些框架為了要搜尋代碼中的注解燎孟,通常都需要經(jīng)歷較長的初始化過程禽作,并且還可能將一些你用不到的對象也一并加載到內(nèi)存當(dāng)中。這些用不到的對象會一直占用著內(nèi)存空間揩页,可能要過很久之后才會得到釋放领迈,相較之下,也許多敲幾行看似繁瑣的代碼才是更好的選擇碍沐。

使用ProGuard簡化代碼

ProGuard相信大家都不會陌生,很多人都會使用這個工具來混淆代碼衷蜓,但是除了混淆之外累提,它還具有壓縮和優(yōu)化代碼的功能。ProGuard會對我們的代碼進(jìn)行檢索磁浇,刪除一些無用的代碼斋陪,并且會對類、字段置吓、方法等進(jìn)行重命名无虚,重命名之后的類、字段和方法名都會比原來簡短很多衍锚,這樣的話也就對內(nèi)存的占用變得更少了友题。

使用多個進(jìn)程

這個技巧其實(shí)并不是非常建議使用,但它確實(shí)是一種可以幫助我們節(jié)省和管理內(nèi)存的高級技巧戴质。如果你要使用它的話一定要謹(jǐn)慎使用度宦,因?yàn)榻^大多數(shù)的應(yīng)用程序都不應(yīng)該在多個進(jìn)程當(dāng)中運(yùn)行的,一旦使用不當(dāng)告匠,它甚至?xí)黾宇~外的內(nèi)存而不是幫我們節(jié)省內(nèi)存戈抄。這個技巧比較適用于那些需要在后臺去完成一項(xiàng)獨(dú)立的任務(wù),和前臺的功能是可以完全區(qū)分開的場景后专。

這里舉一個比較適合去使用多進(jìn)程技巧的場景划鸽,比如說我們正在做一個音樂播放器軟件,其中播放音樂的功能應(yīng)該是一個獨(dú)立的功能戚哎,它不需要和UI方面有任何關(guān)系裸诽,即使軟件已經(jīng)關(guān)閉了也應(yīng)該可以正常播放音樂。如果此時我們只使用一個進(jìn)程建瘫,那么即使用戶關(guān)閉了軟件崭捍,已經(jīng)完全由Service來控制音樂播放了,系統(tǒng)仍然會將許多UI方面的內(nèi)存進(jìn)行保留啰脚。在這種場景下就非常適合使用兩個進(jìn)程殷蛇,一個用于UI展示实夹,另一個則用于在后臺持續(xù)地播放音樂。

想要實(shí)現(xiàn)多進(jìn)程的功能也非常簡單粒梦,只需要在AndroidManifest文件的應(yīng)用程序組件中聲明一個android:process屬性就可以了亮航,比如說我們希望播放音樂的Service可以運(yùn)行在一個單獨(dú)的進(jìn)程當(dāng)中,就可以這樣寫:

[java]view plaincopy

android:process=":background"/>

這里指定的進(jìn)程名是background匀们,你也可以將它改成任意你喜歡的名字缴淋。需要注意的是,進(jìn)程名的前面都應(yīng)該加上一個冒號泄朴,表示該進(jìn)程是一個當(dāng)前應(yīng)用程序的私有進(jìn)程重抖。


http://blog.csdn.net/guolin_blog/article/details/42238627

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市祖灰,隨后出現(xiàn)的幾起案子钟沛,更是在濱河造成了極大的恐慌,老刑警劉巖局扶,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件恨统,死亡現(xiàn)場離奇詭異,居然都是意外死亡三妈,警方通過查閱死者的電腦和手機(jī)畜埋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來畴蒲,“玉大人悠鞍,你說我怎么就攤上這事∧T铮” “怎么了狞玛?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長涧窒。 經(jīng)常有香客問我心肪,道長,這世上最難降的妖魔是什么纠吴? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任硬鞍,我火速辦了婚禮,結(jié)果婚禮上戴已,老公的妹妹穿的比我還像新娘固该。我一直安慰自己,他們只是感情好糖儡,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布伐坏。 她就那樣靜靜地躺著,像睡著了一般握联。 火紅的嫁衣襯著肌膚如雪桦沉。 梳的紋絲不亂的頭發(fā)上每瞒,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天,我揣著相機(jī)與錄音纯露,去河邊找鬼剿骨。 笑死,一個胖子當(dāng)著我的面吹牛埠褪,可吹牛的內(nèi)容都是我干的浓利。 我是一名探鬼主播,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼钞速,長吁一口氣:“原來是場噩夢啊……” “哼贷掖!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起渴语,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤羽资,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后遵班,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡潮改,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年狭郑,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片汇在。...
    茶點(diǎn)故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡翰萨,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出糕殉,到底是詐尸還是另有隱情亩鬼,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布阿蝶,位于F島的核電站雳锋,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏羡洁。R本人自食惡果不足惜玷过,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望筑煮。 院中可真熱鬧辛蚊,春花似錦、人聲如沸真仲。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽秸应。三九已至虑凛,卻和暖如春碑宴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背卧檐。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工墓懂, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人霉囚。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓捕仔,卻偏偏與公主長得像,于是被迫代替她去往敵國和親盈罐。 傳聞我的和親對象是個殘疾皇子榜跌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評論 2 359

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,284評論 25 707
  • HereAndroid的內(nèi)存優(yōu)化是性能優(yōu)化中很重要的一部分,而避免OOM又是內(nèi)存優(yōu)化中比較核心的一點(diǎn)盅粪。這是一篇關(guān)于...
    HarryXR閱讀 3,821評論 1 24
  • 本文轉(zhuǎn)載來源 http://www.csdn.net/article/2015-09-18/2825737/1 (...
    yoosir閱讀 1,099評論 0 5
  • 我從小就不善于寫作钓葫,不善于記錄,做事情往往是想的太多做得太少票顾!但是我想在今天記錄下我想改變一些缺點(diǎn)的這一天础浮。
    銘銘111閱讀 89評論 0 0
  • 這一天,世界上只剩下L一個人了奠骄。 L也并沒有覺得悲傷豆同,照常地起床,洗漱含鳞,吃飯影锈,端坐在窗前發(fā)呆。這一天的天氣格外晴朗...
    羅綺閱讀 584評論 0 2