2019-06-03

一权悟、Git Svn:

1.沖突怎么解決缰揪?

Git解決沖突:
1陨享、拉去最新代碼,將更新的工程文件內(nèi)容,替換到本地的工程文件

? 2抛姑、將本地項(xiàng)目的文件刪除一遍引用赞厕,再重新拖入(在工程打開后去刪除引用,而不是在本地項(xiàng)目里刪除)

SVN解決沖突辦法:

? 1、刪除本地.Xcodeproj.

? 2定硝、再次從svn更新一遍(工程文件會(huì)重新下載到本地)

? 3皿桑、將本地項(xiàng)目的文件刪除一遍引用,再重新拖入(在工程打開后去刪除引用,而不是在本地項(xiàng)目里刪除)

Git創(chuàng)建分支以及合并:

? 1蔬啡、獲取主分支代碼(點(diǎn)擊check out project from version control)

? 2诲侮、導(dǎo)入代碼后需要?jiǎng)?chuàng)建新的分支(VCS->Git->Branches)

? 3、點(diǎn)擊New Branch星爪,在新的彈窗中輸入新的分支名點(diǎn)擊ok保存之后浆西,就會(huì)切換到新創(chuàng)建的分支里粉私,然后在這個(gè)分支上進(jìn)行開發(fā)和push顽腾,push成功后就可以看到新的分支

合并:

? 1.分支切換,選中需要切換到的新分支A然后checkout即可切換到分支A诺核。

? 2.分支合并抄肖,A合并到B。先切換到分支B窖杀,然后選擇merge的分支A進(jìn)行合并漓摩。

SVN創(chuàng)建分支以及合并:

? 1、創(chuàng)建測試項(xiàng)目并使其和SVN進(jìn)行關(guān)聯(lián)

? 2入客、提交本地新增或改變的文件(創(chuàng)建新分支前最好先將本地修改的文件提升至SVN管毙,SVN每一次提交操作時(shí),都會(huì)有一個(gè)對(duì)應(yīng)的Revision.創(chuàng)建分支前最后一次提交修改文件時(shí)桌硫,該操作對(duì)應(yīng)的Revision以供后續(xù)合并分支時(shí)使用)

? 3夭咬、創(chuàng)建新分支.將項(xiàng)目切換至Project目錄,選中項(xiàng)目后點(diǎn)擊右鍵依此選擇Subversion->Branch or Tag

? 4、根據(jù)需要選擇拷貝源铆隘、新分支目錄卓舵、修改分支項(xiàng)目文件名等,然后填寫Comment膀钠,點(diǎn)擊OK掏湾。分支創(chuàng)建成功后,在SVN倉庫branches目錄對(duì)應(yīng)的文件下選擇SVN Update拉取分支代碼

? 5肿嘲、在branches文件目錄下出現(xiàn)一個(gè)新的文件夾new_branch時(shí)融击,新分支創(chuàng)建徹底完成

合并:

? 1、將分支的改動(dòng)合并到主干(在Android Studio中打開主干項(xiàng)目雳窟,切換至Project目錄尊浪,選中項(xiàng)目并點(diǎn)擊右鍵,依次選擇Subversion-> Integrate Directory)

? 注:Revision默認(rèn)選中的都是HEAD(即:最新版),此時(shí)若點(diǎn)擊OK际长,主干新創(chuàng)建的類會(huì)被刪除耸采,主干和分支同時(shí)修改的類會(huì)被分支覆蓋,主干中的文件及其內(nèi)容將變成和分支一模一樣;

? 獲取該Revision的方式:

? ? (1)工育、選中Source 1右側(cè)的Revision為Specified虾宇,然后點(diǎn)擊其右側(cè)的 ... 按鈕

? ? (2)、我們還可以通過查看提交日志的方式如绸,來查看最后一次提交修改所對(duì)應(yīng)的Revision嘱朽。打開本地從SVN更新到的文件的根目錄下,在空白處點(diǎn)擊右鍵怔接,依次選擇TortoiseSVN->Show log

? 通過上面的兩種方式得到修改分支合并時(shí)的配置后點(diǎn)擊OK

? 2搪泳、將主干大改動(dòng)合并到分支

? ? 首先在Android Studio中打開分支項(xiàng)目,從SVN更新代碼扼脐,保證分支對(duì)應(yīng)的本地代碼是最新的岸军。

從主干合并至分支時(shí)的其他過程與上述合并過程基本一致,只需將合并配置頁的Source 1和Source 2對(duì)應(yīng)的分支路徑進(jìn)行調(diào)換瓦侮,Source 1(即:分支路徑)對(duì)應(yīng)的Revision選擇創(chuàng)建該分支時(shí)艰赞,該操作所對(duì)應(yīng)的Revision即可

2.分支怎么創(chuàng)建?

在Androidstudio上直接創(chuàng)建分支肚吏,通過git命令創(chuàng)建分支方妖,在GitHub上創(chuàng)建分支

3.分支是干什么的?

? SVN的分支是一個(gè)完整的目錄罚攀,這個(gè)目錄擁有完整的實(shí)際文件党觅,你如果修改一個(gè)分支其他人也得重新切分支重新下載;Git分支可以在任意自己的本地版本庫開啟無線分支斋泄,自己可以在自己的分支做自己想做的不用管其他分支影響自己杯瞻,分支名可以使用不同名字

分支是用來做版本更新的

4.怎么合并分支?

在Android studio中選擇主分支是己,然后點(diǎn)擊Merge into Current進(jìn)行子分支與主分支的合并又兵,然后切換到子分支,同上合并主分支與子分支卒废。

二沛厨、gradle:

Gradle是一個(gè)基于Apache Ant和Apache Maven概念的項(xiàng)目自動(dòng)化建構(gòu)工具。它使用一種基于Groovy的特定領(lǐng)域語言來聲明項(xiàng)目設(shè)置摔认,而不是傳統(tǒng)的XML逆皮。支持的語言限于Java、Groovy和Scala参袱。

Gradle就是工程的管理电谣,幫我們做了依賴,打包,部署,發(fā)布,各種渠道的差異管理等工作秽梅。

1.buildscript

buildscript中的聲明是gradle腳本自身需要使用的資源〗宋可以聲明的資源包括依賴項(xiàng)企垦、第三方插件、maven倉庫地址等晒来。

3.repositories

jcenter()钞诡、maven()和google()就是托管第三方插件的平臺(tái)

4.dependencies

當(dāng)然配置了倉庫還不夠,我們還需要在dependencies{}里面的配置里湃崩,把需要配置的依賴用classpath配置上荧降,因?yàn)檫@個(gè)dependencies在buildscript{}里面,所以代表的是Gradle需要的插件攒读。

allprojects

allprojects塊的repositories用于多項(xiàng)目構(gòu)建朵诫,為所有項(xiàng)目提供共同所需依賴包。而子項(xiàng)目可以配置自己的repositories以獲取自己獨(dú)需的依賴包薄扁。

buildscript和allprojects的作用和區(qū)別

buildscript中的聲明是gradle腳本自身需要使用的資源剪返,就是說他是管家自己需要的資源,跟你這個(gè)大少爺其實(shí)并沒有什么關(guān)系泌辫。而allprojects聲明的卻是你所有module所需要使用的資源随夸,就是說如果大少爺你的每個(gè)module都需要用同一個(gè)第三庫的時(shí)候,你可以在allprojects里面聲明震放。

apply plugin:'×××':叫做二進(jìn)制插件,二進(jìn)制插件一般都是被打包在一個(gè)jar里獨(dú)立發(fā)布的驼修,比如我們自定義的插件殿遂,再發(fā)布的時(shí)候我們也可以為其指定plugin id,這個(gè)plugin id最好是一個(gè)全限定名稱乙各,就像你的包名一樣墨礁;

apply from:'×××':叫做應(yīng)用腳本插件,其實(shí)這不能算一個(gè)插件耳峦,它只是一個(gè)腳本恩静。應(yīng)用腳本插件,其實(shí)就是把這個(gè)腳本加載進(jìn)來蹲坷,和二進(jìn)制插件不同的是它使用的是from關(guān)鍵字.后面緊跟的坫一個(gè)腳本文件驶乾,可以是本地的,也可以是網(wǎng)絡(luò)存在的循签,如果是網(wǎng)絡(luò)上的話要使用HTTP URL.雖然它不是一個(gè)真正的插件级乐,但是不能忽視它的作用.它是腳本文件模塊化的基礎(chǔ),我們可以把龐大的腳本文件.進(jìn)行分塊县匠、分段整理.拆分成一個(gè)個(gè)共用风科、職責(zé)分明的文件撒轮,然后使用apply from來引用它們,比如我們可以把常用的函數(shù)放在一個(gè)Utils.gradle腳本里贼穆,供其他腳本文件引用题山。示例中我們把 App的版本名稱和版本號(hào)單獨(dú)放在一個(gè)腳本文件里,清晰故痊、簡單臀蛛、方便、快捷.我們也可以使用自動(dòng)化對(duì)該文件自動(dòng)處理崖蜜,生成版本浊仆。

Gradle插件的作用

1.可以添加任務(wù)到你的項(xiàng)目中,幫你完成一些亊情豫领,比如測試抡柿、編譯、打包等恐。

2.可以添加依賴配置到你的項(xiàng)目中洲劣,我們可以通過它們配置我們項(xiàng)目在構(gòu)建過程中需要的依賴.比 如我們編譯的時(shí)候依賴的第三方庫等。

3.可以向項(xiàng)目中現(xiàn)有的對(duì)象類型添加新的擴(kuò)展屬性课蔬、 方法等囱稽,讓你可以使用它們幫助我們配置、優(yōu)化構(gòu)建二跋,比如android{}這個(gè)配置塊就是Android Gradle插件為Project對(duì)象添加的一個(gè)擴(kuò)展战惊。

4. 可以對(duì)項(xiàng)目進(jìn)行一些約定,比如應(yīng)用Java插 件之后扎即,約定src/main/java目錄下是我們的源代碼存放位置吞获,在編譯的時(shí)候也是編譯這個(gè)目錄下的Java源代碼文件。

1.App插件id:com.android.application.

2.Library插件id:com.android.library.

3.Test插件id:com.android.test.

一般一個(gè)項(xiàng)目只會(huì)設(shè)置一個(gè)App插件谚鄙,而module一般是會(huì)設(shè)置為Library插

配置簽名文件:release()

首先各拷,在菜單欄中,點(diǎn)擊 Build > Generate Signed APK闷营,新建一個(gè)密鑰庫

Key store path:選擇創(chuàng)建密鑰庫的位置 + 密鑰庫名字+jks烤黍。

Password:為您的密鑰庫創(chuàng)建并確認(rèn)一個(gè)安全的密碼。

Alias:為您的密鑰輸入一個(gè)標(biāo)識(shí)名傻盟。

Password:為您的密鑰創(chuàng)建并確認(rèn)一個(gè)安全的密碼速蕊。此密碼應(yīng)當(dāng)與您為密鑰庫選擇的密碼不同

Validity (years):以年為單位設(shè)置密鑰的有效時(shí)長。密鑰的有效期應(yīng)至少為 25 年莫杈,以便您可以在應(yīng)用的整個(gè)生命期內(nèi)使用相同的密鑰簽署應(yīng)用更新互例。默認(rèn)為25

Certificate:為證書輸入一些關(guān)于您自己的信息。此信息不會(huì)顯示在應(yīng)用中筝闹,但會(huì)作為 APK 的一部分包含在您的證書中媳叨。

1.在 Project 窗口中腥光,右鍵點(diǎn)擊您的應(yīng)用并點(diǎn)擊 Open Module Settings。

2.在 Project Structure 窗口左面板中的 Modules 下糊秆,點(diǎn)擊您想要簽署的模塊武福。

3.點(diǎn)擊 Signing 標(biāo)簽,然后點(diǎn)擊 ‘+’ 痘番。

4.選擇您的密鑰庫文件捉片,為此簽署配置輸入一個(gè)名稱(隨意起一個(gè)),然后輸入所需的信息汞舱。

三伍纫、性能優(yōu)化:

內(nèi)存優(yōu)化

在 Android 系統(tǒng)中有個(gè)垃圾內(nèi)存回收機(jī)制,在虛擬機(jī)層自動(dòng)分配和釋放內(nèi)存昂芜,因此不需要在代碼中分配和釋放某一塊內(nèi)存莹规,從應(yīng)用層面上不容易出現(xiàn)內(nèi)存泄漏和內(nèi)存溢出等問題,但是需要內(nèi)存管理泌神。

Android 系統(tǒng)在內(nèi)存管理上有一個(gè) Generational Heap Memory 模型良漱,內(nèi)存回收的大部分壓力不需要應(yīng)用層關(guān)心, Generational Heap Memory 有自己一套管理機(jī)制欢际,當(dāng)內(nèi)存達(dá)到一個(gè)閾值時(shí)母市,系統(tǒng)會(huì)根據(jù)不同的規(guī)則自動(dòng)釋放系統(tǒng)認(rèn)為可以釋放的內(nèi)存,也正是因?yàn)?Android 程序把內(nèi)存控制的權(quán)力交給了 Generational Heap

Memory损趋,一旦出現(xiàn)內(nèi)存泄漏和溢出方面的問題患久,排查錯(cuò)誤將會(huì)成為一項(xiàng)異常艱難的工作。

除此之外舶沿,部分 Android 應(yīng)用開發(fā)人員在開發(fā)過程中并沒有特別關(guān)注內(nèi)存的合理使用墙杯,也沒有在內(nèi)存方面做太多的優(yōu)化,當(dāng)應(yīng)用程序同時(shí)運(yùn)行越來越多的任務(wù)括荡,加上越來越復(fù)雜的業(yè)務(wù)需求時(shí),完全依賴 Android 的內(nèi)存管理機(jī)制就會(huì)導(dǎo)致一系列性能問題逐漸呈現(xiàn)溉旋,對(duì)應(yīng)用的穩(wěn)定性和性能帶來不可忽視的影響畸冲,因此,解決內(nèi)存問題和合理優(yōu)化內(nèi)存是非常有必要的观腊。

常見內(nèi)存泄漏場景

handler耗時(shí)引發(fā)的內(nèi)存泄漏

當(dāng)activity當(dāng)中存在handler接收耗時(shí)的消息時(shí)邑闲,比如我們一般在網(wǎng)絡(luò)請(qǐng)求切換線程時(shí),經(jīng)常使用到handler梧油,假設(shè)消息還沒有發(fā)送完成苫耸,但是頁面已經(jīng)被關(guān)閉,也就說activity已經(jīng)執(zhí)行了ondestroy方法儡陨。當(dāng)gc回收時(shí)褪子,會(huì)出現(xiàn)改activity不能被回收的情況量淌,到時(shí)內(nèi)存泄漏。

解決辦法:當(dāng)activity銷毀的時(shí)候嫌褪,調(diào)用handler的removeCallbacksAndMessages方法呀枢,移除消息任務(wù),然后將handler對(duì)象及線程置空笼痛。


內(nèi)部類引發(fā)的內(nèi)存泄漏(當(dāng)然handler或子線程一般也作為內(nèi)部類使用)

因?yàn)閖ava當(dāng)中裙秋,內(nèi)部類默認(rèn)持有外部類的引用,當(dāng)外部類銷毀后缨伊,一旦gc回收該實(shí)例摘刑,發(fā)現(xiàn)內(nèi)部類持有他的引用而導(dǎo)致不能回收該實(shí)例,出現(xiàn)內(nèi)存泄漏的情況刻坊。

解決方法:將內(nèi)部類改為靜態(tài)內(nèi)部類枷恕,因?yàn)殪o態(tài)內(nèi)部類生命周期和應(yīng)用一樣長,所以當(dāng)退出程序的時(shí)候會(huì)一同回收該實(shí)例紧唱,并不會(huì)影響外部類的回收活尊。

單例導(dǎo)致的內(nèi)存泄漏

因?yàn)樵谑褂脝卫臅r(shí)候,經(jīng)常會(huì)傳入一個(gè)本類的上下文對(duì)象漏益,而單例是靜態(tài)的蛹锰,生命周期和application一樣長,當(dāng)activity銷毀的時(shí)候绰疤,該單例持有activity的引用導(dǎo)致其不能被回收铜犬,出現(xiàn)內(nèi)存泄漏。

解決方法:在使用上下文的時(shí)候轻庆,傳全局上下文癣猾。

資源未關(guān)閉

Cursor,stream余爆,database纷宇,Butterknife,broadcastreciver蛾方,bindservice像捶,eventBus

比如這些東西在使用完成后,需要進(jìn)行close或者Unbind處理桩砰,以節(jié)省內(nèi)存

Bitmap對(duì)象不在使用時(shí)調(diào)用recycle()釋放內(nèi)存

Timer計(jì)時(shí)器拓春、動(dòng)畫,因?yàn)檫@些涉及耗時(shí)問題亚隅,如果activity銷毀硼莽,而該任務(wù)并未執(zhí)行完成,會(huì)導(dǎo)致內(nèi)存泄漏煮纵,所以一般在activity中如果使用到這些耗時(shí)任務(wù)懂鸵,需要在activity銷毀時(shí)偏螺,做對(duì)應(yīng)處理,比如調(diào)用timer的cancel方法矾瑰,或者動(dòng)畫的cancel方法并將對(duì)象置空

一些監(jiān)聽器的內(nèi)存泄漏砖茸,比如說我們給edittext設(shè)置輸入文字監(jiān)聽時(shí),當(dāng)監(jiān)聽到文字發(fā)生變化殴穴,我們通過獲取變化后的文字執(zhí)行了耗時(shí)任務(wù)(比如獲取到edittext里的內(nèi)容上傳服務(wù)器)凉夯,當(dāng)耗時(shí)任務(wù)未執(zhí)行完成activity銷毀了,會(huì)引發(fā)內(nèi)存泄漏采幌,所以在onDestory時(shí)劲够,取消注冊(cè),比如說editText調(diào)用removeTextChangedListener方法

Rxjava的內(nèi)存泄漏:因?yàn)閞xjava采用的是觀察者模式休傍,當(dāng)請(qǐng)求到數(shù)據(jù)后會(huì)根據(jù)訂閱關(guān)系將數(shù)據(jù)發(fā)送個(gè)訂閱者征绎,而如果這時(shí)訂閱者已經(jīng)銷毀,就會(huì)出現(xiàn)引用該對(duì)象導(dǎo)致其不能被回收的情況磨取,出現(xiàn)內(nèi)存泄漏人柿,rxjava2發(fā)布的時(shí)候也發(fā)現(xiàn)了這個(gè)問題,所以在回調(diào)當(dāng)中忙厌,新增加了onSubcribe回調(diào)凫岖,同時(shí)返回了一個(gè)disposable對(duì)象,可以通過判斷disposable里的isDisposed來確定當(dāng)前的訂閱關(guān)系逢净,如果訂閱關(guān)系中的訂閱者已經(jīng)不存在且當(dāng)前訂閱關(guān)系存在哥放,解除訂閱關(guān)系,并終止數(shù)據(jù)的發(fā)送爹土。

webView引發(fā)的內(nèi)存泄漏:因?yàn)閣ebview在使用的時(shí)候一般持有activity的引用甥雕,我們一般在activity的onDestroy方法中調(diào)用mWebView.destroy();來釋放webview。如果在onDetachedFromWindow之前調(diào)用了destroy那就肯定會(huì)無法正常反注冊(cè)了胀茵,也就會(huì)導(dǎo)致內(nèi)存泄漏社露。所以在銷毀webview前一定要先在onDetachedFromWindow中將webview從它的父view中移除,再調(diào)用destroy方法中調(diào)用webview的destroy琼娘,我開發(fā)的時(shí)候在5.1以上的手機(jī)上發(fā)現(xiàn)這種問題比較多呵哨,因?yàn)楝F(xiàn)在5.1以下適配的比較少了,基本沒咋注意轨奄。

線程導(dǎo)致的內(nèi)存泄漏:一般使用子線程都會(huì)創(chuàng)建一個(gè)內(nèi)部類對(duì)象,而創(chuàng)建線程一般執(zhí)行耗時(shí)任務(wù)拒炎,所以這個(gè)內(nèi)部類默認(rèn)持有外部類的引用挪拟,如果耗時(shí)任務(wù)在activity銷毀的時(shí)候未執(zhí)行完成,會(huì)因?yàn)槌钟型獠款愐脤?dǎo)致外部類不能被回收击你。

布局優(yōu)化

減少層級(jí)玉组。合理使用 RelativeLayout 和 LinerLayout谎柄,合理使用Merge。

提高顯示速度惯雳。使用 ViewStub朝巫,它是一個(gè)看不見的、不占布局位置石景、占用資源非常小的視圖對(duì)象劈猿。

布局復(fù)用〕蹦酰可以通過?標(biāo)簽來提高復(fù)用揪荣。

盡可能少用wrap_content。wrap_content 會(huì)增加布局 measure 時(shí)計(jì)算成本往史,在已知寬高為固定值時(shí)仗颈,不用wrap_content 。

刪除控件中無用的屬性

電量優(yōu)化?

在移動(dòng)設(shè)備中椎例,電池的重要性不言而喻挨决,沒有電什么都干不成。對(duì)于操作系統(tǒng)和設(shè)備開發(fā)商來說订歪,耗電優(yōu)化一致沒有停止脖祈,去追求更長的待機(jī)時(shí)間,而對(duì)于一款應(yīng)用來說陌粹,并不是可以忽略電量使用問題撒犀,特別是那些被歸為“電池殺手”的應(yīng)用,最終的結(jié)果是被卸載掏秩。因此或舞,應(yīng)用開發(fā)者在實(shí)現(xiàn)需求的同時(shí),需要盡量減少電量的消耗蒙幻。

在Android5.0 以前映凳,在應(yīng)用中測試電量消耗比較麻煩,也不準(zhǔn)確邮破,5.0之后專門引入了一個(gè)獲取設(shè)備上電量消耗信息的API:Battery Historian诈豌。Battery

Historian 是一款由 Google 提供的 Android 系統(tǒng)電量分析工具,和Systrace 一樣抒和,是一款圖形化數(shù)據(jù)分析工具矫渔,直觀地展示出手機(jī)的電量消耗過程,通過輸入電量分析文件摧莽,顯示消耗情況庙洼,最后提供一些可供參考電量優(yōu)化的方法。

除此之外,還有一些常用方案可提供:

[if !supportLists]·???????[endif]計(jì)算優(yōu)化油够,避開浮點(diǎn)運(yùn)算等蚁袭。

[if !supportLists]·???????[endif]避免 WaleLock使用不當(dāng)。

[if !supportLists]·???????[endif]使用 Job

Scheduler石咬。

流量

應(yīng)用提供檢索用戶的流量節(jié)省程序偏好監(jiān)控偏好變化的途徑揩悄。

在 Android 7.0( API 級(jí)別 24)中,應(yīng)用可以使用?ConnectivityManager?API 來確定正在應(yīng)用的是哪些流量消耗限制。getRestrictBackgroundStatus()?方法返回下列值之一:

RESTRICT_BACKGROUND_STATUS_DISABLED

流量節(jié)省程序已停用。

RESTRICT_BACKGROUND_STATUS_ENABLED

用戶已為此應(yīng)用啟用流量節(jié)省程序镶摘。應(yīng)用應(yīng)努力限制前臺(tái)流量消耗穆壕,并妥善處理后臺(tái)流量消耗限制。

RESTRICT_BACKGROUND_STATUS_WHITELISTED

用戶已啟用流量節(jié)省程序,但應(yīng)用在白名單中。應(yīng)用應(yīng)努力限制前臺(tái)和后臺(tái)流量消耗。

這被認(rèn)為是在設(shè)備連接到按流量計(jì)費(fèi)的網(wǎng)絡(luò)時(shí)限制流量消耗的有效方法汗侵,即使流量節(jié)省程序遭到停用或應(yīng)用在白名單中也是如此。以下示例代碼使用?ConnectivityManager.isActiveNetworkMetered()?和?ConnectivityManager.getRestrictBackgroundStatus()?來確定應(yīng)用應(yīng)使用多少數(shù)據(jù)群发。

應(yīng)用可以通過創(chuàng)建?BroadcastReceiver?偵聽?ConnectivityManager.ACTION_RESTRICT_BACKGROUND_CHANGED晰韵,以及使用?Context.registerReceiver()?動(dòng)態(tài)注冊(cè)接收器來監(jiān)控流量節(jié)省程序偏好變化。當(dāng)應(yīng)用接收到這條廣播時(shí)熟妓,應(yīng)通過調(diào)用?ConnectivityManager.getRestrictBackgroundStatus()?來檢查新的流量節(jié)省程序偏好是否會(huì)影響其權(quán)限雪猪。

啟動(dòng)

優(yōu)化啟動(dòng)邏輯,提高應(yīng)用的啟動(dòng)速度起愈。啟動(dòng)主要完成三件事:UI 布局只恨、繪制和數(shù)據(jù)準(zhǔn)備。因此啟動(dòng)速度優(yōu)化就是需要優(yōu)化這三個(gè)過程:

UI 布局抬虽。應(yīng)用一般都有閃屏頁官觅,優(yōu)化閃屏頁的 UI 布局,可以通過 Profile GPU Rendering 檢測丟幀情況阐污。

啟動(dòng)加載邏輯優(yōu)化休涤。可以采用分布加載笛辟、異步加載功氨、延期加載策略來提高應(yīng)用啟動(dòng)速度。

數(shù)據(jù)準(zhǔn)備手幢。數(shù)據(jù)初始化分析捷凄,加載數(shù)據(jù)可以考慮用線程初始化等策略

內(nèi)存抖動(dòng)

內(nèi)存抖動(dòng)是指在短時(shí)間內(nèi)有大量的對(duì)象被創(chuàng)建或被回收的現(xiàn)象,導(dǎo)致頻繁GC围来,而開發(fā)時(shí)由于不注意纵势,頻繁在循環(huán)里創(chuàng)建局部對(duì)象會(huì)導(dǎo)致大量對(duì)象在短時(shí)間內(nèi)被創(chuàng)建和回收踱阿,如果頻繁程度不夠嚴(yán)重的話,不會(huì)造成內(nèi)存抖動(dòng)钦铁;如果內(nèi)存抖動(dòng)的特別頻繁,會(huì)導(dǎo)致短時(shí)間內(nèi)產(chǎn)生大量對(duì)象才漆,需要大量內(nèi)存牛曹,而且還頻繁回收創(chuàng)建〈祭模總之黎比,頻繁GC會(huì)導(dǎo)致內(nèi)存抖動(dòng)。

解決:盡量避免在循環(huán)體或者頻繁調(diào)用的函數(shù)內(nèi)創(chuàng)建對(duì)象鸳玩,應(yīng)該把對(duì)象創(chuàng)建移到循環(huán)體外阅虫。總之就是盡量避免頻繁GC不跟。

檢測內(nèi)存:studio自帶工具:直觀的看到內(nèi)存變化颓帝,需要到他對(duì)應(yīng)的????

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市窝革,隨后出現(xiàn)的幾起案子购城,更是在濱河造成了極大的恐慌,老刑警劉巖虐译,帶你破解...
    沈念sama閱讀 222,681評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瘪板,死亡現(xiàn)場離奇詭異,居然都是意外死亡漆诽,警方通過查閱死者的電腦和手機(jī)侮攀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來厢拭,“玉大人兰英,你說我怎么就攤上這事◎礁” “怎么了箭昵?”我有些...
    開封第一講書人閱讀 169,421評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長回季。 經(jīng)常有香客問我家制,道長,這世上最難降的妖魔是什么泡一? 我笑而不...
    開封第一講書人閱讀 60,114評(píng)論 1 300
  • 正文 為了忘掉前任颤殴,我火速辦了婚禮,結(jié)果婚禮上鼻忠,老公的妹妹穿的比我還像新娘涵但。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,116評(píng)論 6 398
  • 文/花漫 我一把揭開白布矮瘟。 她就那樣靜靜地躺著瞳脓,像睡著了一般。 火紅的嫁衣襯著肌膚如雪澈侠。 梳的紋絲不亂的頭發(fā)上劫侧,一...
    開封第一講書人閱讀 52,713評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音哨啃,去河邊找鬼烧栋。 笑死,一個(gè)胖子當(dāng)著我的面吹牛拳球,可吹牛的內(nèi)容都是我干的审姓。 我是一名探鬼主播,決...
    沈念sama閱讀 41,170評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼祝峻,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼魔吐!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起呼猪,我...
    開封第一講書人閱讀 40,116評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤画畅,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后宋距,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體轴踱,經(jīng)...
    沈念sama閱讀 46,651評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,714評(píng)論 3 342
  • 正文 我和宋清朗相戀三年谚赎,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了淫僻。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,865評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡壶唤,死狀恐怖雳灵,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情闸盔,我是刑警寧澤悯辙,帶...
    沈念sama閱讀 36,527評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站迎吵,受9級(jí)特大地震影響躲撰,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜击费,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,211評(píng)論 3 336
  • 文/蒙蒙 一拢蛋、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蔫巩,春花似錦谆棱、人聲如沸快压。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蔫劣。三九已至,卻和暖如春皆警,著一層夾襖步出監(jiān)牢的瞬間拦宣,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評(píng)論 1 274
  • 我被黑心中介騙來泰國打工信姓, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人绸罗。 一個(gè)月前我還...
    沈念sama閱讀 49,299評(píng)論 3 379
  • 正文 我出身青樓意推,卻偏偏與公主長得像,于是被迫代替她去往敵國和親珊蟀。 傳聞我的和親對(duì)象是個(gè)殘疾皇子菊值,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,870評(píng)論 2 361

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