mainshide

https://blog.csdn.net/huangqili1314/article/details/72792682

基礎(chǔ)知識(shí) – 四大組件(生命周期茸时,使用場景,如何啟動(dòng))

  • 啟動(dòng)模式
    1.Standard
    image.png

    2.SingleTop 棧頂復(fù)用模式
    說明:分兩種處理情況:須要?jiǎng)?chuàng)建的Activity已經(jīng)處于棧頂時(shí),此時(shí)會(huì)直接復(fù)用棧頂?shù)腁ctivity。不會(huì)再創(chuàng)建新的Activity;若須要?jiǎng)?chuàng)建的Activity不處于棧頂砰左,此時(shí)會(huì)又一次創(chuàng)建一個(gè)新的Activity入棧,同Standard模式一樣场航。
    生命周期:若情況一中棧頂?shù)腁ctivity被直接復(fù)用時(shí)缠导,它的onCreate、onStart不會(huì)被系統(tǒng)調(diào)用溉痢,由于它并沒有發(fā)生改變僻造。可是一個(gè)新的方法onNewIntent會(huì)被回調(diào)(Activity被正常創(chuàng)建時(shí)不會(huì)回調(diào)此方法)孩饼。
    image.png

    3. SingleTask 棧內(nèi)復(fù)用模式
    說明:若須要?jiǎng)?chuàng)建的Activity已經(jīng)處于棧中時(shí)髓削,此時(shí)不會(huì)創(chuàng)建新的Activity,而是將存在棧中的Activity上面的其他Activity所有銷毀镀娶,使它成為棧頂立膛。
    生命周期:同SingleTop 模式中的情況一同樣。僅僅會(huì)又一次回調(diào)Activity中的 onNewIntent方法
    image.png

    4. SingleInstance 單實(shí)例模式
    說明: SingleInstance比較特殊梯码,是全局單例模式宝泵,是一種加強(qiáng)的SingleTask模式。它除了具有它所有特性外轩娶,還加強(qiáng)了一點(diǎn):具有此模式的Activity僅僅能單獨(dú)位于一個(gè)任務(wù)棧中儿奶。

java基礎(chǔ) – 數(shù)據(jù)結(jié)構(gòu),基本數(shù)據(jù)類型

一鳄抒、Java常用數(shù)據(jù)結(jié)構(gòu):

  1. ArrayList:元素單個(gè)闯捎,效率高,多用于查詢许溅;
    2.Vector:元素單個(gè)瓤鼻,線程安全,多用于查詢闹司;
    3.LinkedList:元素單個(gè)娱仔,多用于插入和刪除沐飘;
    4.HashMap:元素成對游桩,非同步的牲迫,并且允許null,即null value和null key借卧;
  2. HashTable:元素成對盹憎,線程安全,元素不可為空铐刘;
    ** 二陪每、Vector、ArrayList和LinkedList**
    大多數(shù)情況下镰吵,從性能上來說ArrayList最好檩禾,但是當(dāng)集合內(nèi)的元素需要頻繁插入、刪除時(shí)LinkedList會(huì)有比較好的表現(xiàn)疤祭,此外LinkedList提供額外的get盼产,remove,insert方法在LinkedList的首部或尾部勺馆,但是它們?nèi)齻€(gè)性能都比不上數(shù)組戏售,另外只有Vector是線程同步的,所以:
    如果能用數(shù)組的時(shí)候(元素類型固定草穆,數(shù)組長度固定)灌灾,請盡量使用數(shù)組來代替List;
    如果沒有頻繁的刪除插入操作悲柱,又不用考慮多線程問題锋喜,優(yōu)先選擇ArrayList;
    如果在多線程條件下使用诗祸,可以考慮Vector跑芳;
    如果需要頻繁地刪除插入,LinkedList就有了用武之地直颅;
    如果你什么都不知道博个,用ArrayList沒錯(cuò)。

三功偿、基本數(shù)據(jù)類型
1盆佣、內(nèi)置八種數(shù)據(jù)類型(六種數(shù)字類型(四個(gè)整數(shù)型,兩個(gè)浮點(diǎn)型)械荷,一種字符類型共耍,還有一種布爾型):
byte:Java中最小的數(shù)據(jù)類型,在內(nèi)存中占8位(bit)吨瞎,即1個(gè)字節(jié)痹兜,取值范圍-128~127,默認(rèn)值0颤诀;
short:短整型字旭,在內(nèi)存中占16位对湃,即2個(gè)字節(jié),取值范圍-32768~32767遗淳,默認(rèn)值0拍柒;
int:整型,用于存儲(chǔ)整數(shù)屈暗,在內(nèi)在中占32位拆讯,即4個(gè)字節(jié),取值范圍-2147483648~2147483647养叛,默認(rèn)值0种呐;
long:長整型,在內(nèi)存中占64位弃甥,即8個(gè)字節(jié)-263~263-1陕贮,默認(rèn)值0L;
float:浮點(diǎn)型潘飘,在內(nèi)存中占32位肮之,即4個(gè)字節(jié),用于存儲(chǔ)帶小數(shù)點(diǎn)的數(shù)字(與double的區(qū)別在于float類型有效小數(shù)點(diǎn)只有6~7位)卜录,默認(rèn)值0戈擒;
double:雙精度浮點(diǎn)型,用于存儲(chǔ)帶有小數(shù)點(diǎn)的數(shù)字艰毒,在內(nèi)存中占64位筐高,即8個(gè)字節(jié),默認(rèn)值0丑瞧;
char:字符型柑土,用于存儲(chǔ)單個(gè)字符,占16位绊汹,即2個(gè)字節(jié)稽屏,取值范圍0~65535,默認(rèn)值為空西乖;
boolean:布爾類型狐榔,占1個(gè)字節(jié),用于判斷真或假(僅有兩個(gè)值获雕,即true薄腻、false),默認(rèn)值false届案;
2庵楷、引用數(shù)據(jù)類型:
類、接口類型、數(shù)組類型尽纽、枚舉類型昆婿、注解類型。
區(qū)別:
基本數(shù)據(jù)類型在被創(chuàng)建時(shí)蜓斧,在棧上給其劃分一塊內(nèi)存,將數(shù)值直接存儲(chǔ)在棧上睁冬。
引用數(shù)據(jù)類型在被創(chuàng)建時(shí)挎春,首先要在棧上給其引用(句柄)分配一塊內(nèi)存,而對象的具體信息都存儲(chǔ)在堆內(nèi)存上豆拨,然后由棧上面的引用指向堆中對象的地址直奋。

通信 – 網(wǎng)絡(luò)連接(HttpClient,HttpUrlConnetion)施禾,Socket

數(shù)據(jù)持久化 – SQLite脚线,SharedPreferences,ContentProvider

安全 – 數(shù)據(jù)加密弥搞,代碼混淆邮绿,WebView/Js調(diào)用,https

UI– 動(dòng)畫

其他 – JNI攀例,AIDL船逮,Handler,Intent等

RxJava2+Retrofit2+OkHttp3

  • Retrofit:Retrofit是Square公司開發(fā)的一款針對Android 網(wǎng)絡(luò)請求的框架(底層默認(rèn)是基于OkHttp 實(shí)現(xiàn))粤铭。請求的數(shù)據(jù)和請求的結(jié)果挖胃,使用接口的方式呈現(xiàn)。

  • OkHttp:也是Square公司的一款開源的網(wǎng)絡(luò)請求庫梆惯。負(fù)責(zé)請求的過程酱鸭。通過OkHttpClient 可以配置很多東西,比如 鏈接超時(shí)時(shí)間垛吗,緩存凹髓,攔截器等。

  • RxJava:
    a. 負(fù)責(zé)異步怯屉,各種線程之間的切換扁誓,使異步操作變得非常簡單。
    b. 加入RxJava后網(wǎng)絡(luò)請求返回不再是一個(gè)call,二十一個(gè)Observable蚀之。
    c. 在Activity或Fragment中傳入Subscriber 建立訂閱關(guān)系蝗敢,就可以在onNext中處理結(jié)果了。
    d. RxJava 的好處是幫我處理 線程之間的切換足删,我們可以在指定 訂閱的在哪個(gè)線程寿谴,觀察在哪個(gè)線程。
    e. 可以 通過操作符 進(jìn)行數(shù)據(jù)變換失受。
    f . 整個(gè)過程都是鏈?zhǔn)降难忍喕壿嬘缴F渲蠪latMap 操作符 還可以解除多層嵌套的問題。

性能優(yōu)化

性能分析工具
leakcanary blockcanary ddms traceview layout Inspector Analyze Inspect code

響應(yīng)時(shí)間優(yōu)化
1.使用優(yōu)秀的網(wǎng)絡(luò)請求框架庫和數(shù)據(jù)解析框架痪署,如retrofit码泞、okhttp、Gson等;
2.數(shù)據(jù)緩存推薦使用三級(jí)緩存狼犯,內(nèi)存緩存+本地緩存+網(wǎng)絡(luò)請求緩存余寥;圖片有三級(jí)緩存,文件悯森、 java內(nèi)存 和 native 內(nèi)存宋舷,特別針對 5.0以下系統(tǒng)可以用到 native 內(nèi)存緩存,因?yàn)榭梢詼p少 gc 調(diào)用瓢姻。
界面卡頓優(yōu)化
1.避免UI主線程做耗時(shí)操作祝蝠,耗時(shí)操作交給子線程完成,使用handler更新UI.
2.優(yōu)化布局層級(jí)幻碱,避免過多無用嵌(如使用ConstraintLayout約束布局绎狭,扁平式的布局方式,無任何嵌套褥傍,減少布局的層級(jí)坟岔,優(yōu)化渲染性能),Android通知界面渲染和重繪的時(shí)間要在16ms內(nèi)完成摔桦,超出這個(gè)時(shí)間會(huì)導(dǎo)致丟幀社付。可以使用Hierarchy View進(jìn)行層級(jí)分析邻耕。
內(nèi)存優(yōu)化
創(chuàng)建新的對象都需要額外的內(nèi)存空間鸥咖,盡量要減少創(chuàng)建對象。
將類兄世,變量啼辣,方法等的權(quán)限修改為最小。
針對字符串的拼接御滩,盡量使用StringBuffer替代String等鸥拧。
不要在循環(huán)當(dāng)中申明臨時(shí)變量,不要在循環(huán)中捕獲異常削解。
使用集合對象富弦,如果事先知道其大小,則可以在構(gòu)造方法中設(shè)置初始大小氛驮。
文件讀取操作需要使用緩存類腕柜,及時(shí)關(guān)閉文件多艇。
如果程序會(huì)頻繁創(chuàng)建線程早处,則可以考慮使用線程池。

Recyclerview
一種插拔式的體驗(yàn)贿肩,高度的解耦亏栈,異常的靈活架構(gòu)

  • LayoutManager 控制顯示方式:
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
layoutManager.setOrientation(LinearLayoutManager.VERTICAL);

1.LinearLayoutManager線性管理器蔼卡,支持橫向筷屡,縱向布局菠红;
2.GridLayoutManager網(wǎng)格布局管理器;
3.StaggeredGridLayoutManager瀑布流式布局管理器潭流;

  • ItemDecoration控制Item間間隔竞惋,可以通過該方法添加分割線:
    mRecyclerView.addItemDecoration()
    該方法的參數(shù)為RecyclerView.ItemDecoration,該類為抽象類
mRecyclerView.addItemDecoration(new DividerItemDecoration(this,
DividerItemDecoration.VERTICAL_LIST));
  • ItemAnimator控制Item增刪動(dòng)畫幻枉;
  • 但點(diǎn)擊事件,長按事件需要自己寫诡蜓;

常用設(shè)計(jì)模式

單例模式
創(chuàng)建步驟:
a.將構(gòu)造函數(shù)私有化熬甫,構(gòu)造函數(shù)可避免其他程序創(chuàng)建該類對象。
b.在本類中創(chuàng)建一個(gè)私有的該類對象蔓罚。
c.對外提供一個(gè)公共訪問方式椿肩,為了方便其他程序訪問到該類對象。
創(chuàng)建方式:
1.餓漢式:類一加載就創(chuàng)建對象

class Student{
private Student(){}
private static final Student s = new Student();
public static Student getInstance(){
    return s;
 }
} 

2.懶漢式:使用時(shí)才創(chuàng)建該對象

class Student{
private Student(){}
private static final Student s = null;
public static Student getInstance(){
    if(null==s) {
        //線程1就進(jìn)來了豺谈,線程2就進(jìn)來了郑象。
        s = new Student();
    }
    return s;
  }
}

3.餓漢式和飽漢式的區(qū)別:
餓漢式是類一加載進(jìn)內(nèi)存就創(chuàng)建好了對象;而懶漢式則是類加載進(jìn)內(nèi)存的時(shí)候茬末,對象還沒有存在厂榛,要使用該對象的時(shí)候再new出來;
懶漢式是延遲加載,如果多個(gè)線程同時(shí)操作懶漢式時(shí)就有可能出現(xiàn)線程安全問題;
為解決懶漢式的線程安全問題丽惭,解決線程安全問題可以加同步來解決击奶。
但是加了同步之后,每一次都要比較鎖责掏,效率就變慢了柜砾,可以通過雙重判斷來提高程序效率。
注:開發(fā)常用餓漢式换衬,因?yàn)轲I漢式簡單安全痰驱。懶漢式多線程的時(shí)候容易發(fā)生問題

Picasso,Glide瞳浦,F(xiàn)resco對比分析

image.png

Picasso不支持gif,
Glide,Fresco支持gif,


image.png

優(yōu)點(diǎn)

Glide
*緩存機(jī)制

  • 多種圖片格式的緩存担映,適用于更多的內(nèi)容表現(xiàn)形式(如Gif、WebP叫潦、縮略圖另萤、Video)
  • 生命周期集成(根據(jù)Activity或者Fragment的生命周期管理圖片加載請求)
  • 高效處理Bitmap(bitmap的復(fù)用和主動(dòng)回收,減少系統(tǒng)回收壓力)
  • 高效的緩存策略,靈活(Picasso只會(huì)緩存原始尺寸的圖片四敞,Glide緩存的是多種規(guī)格)泛源,加載速度快且內(nèi)存開銷小(默認(rèn)Bitmap格式的不同忿危,使得內(nèi)存開銷是Picasso的一半)

Fresco

  • 最大的優(yōu)勢在于5.0以下(最低2.3)的bitmap加載达箍。在5.0以下系統(tǒng),F(xiàn)resco將圖片放到一個(gè)特別的內(nèi)存區(qū)域(Ashmem區(qū))
  • 大大減少OOM(在更底層的Native層對OOM進(jìn)行處理铺厨,圖片將不再占用App的內(nèi)存)
  • 適用于需要高性能加載大量圖片的場景

結(jié)論

  • Fresco功能強(qiáng)大缎玫,但是對象Glide要復(fù)雜,而且需要自己的SimpleDraweeView,這一點(diǎn)在切換框架的時(shí)候不方便解滓。而且Glide直接緩存ImageView相對大小的圖片赃磨,節(jié)省空間的同時(shí)下場如果是同樣大小的圖片就不要再次請求,直接可以使用洼裤。
  • Fresco雖然很強(qiáng)大邻辉,但是包很大,依賴很多腮鞍,使用復(fù)雜值骇,而且還要在布局使用SimpleDraweeView控件加載圖片。相對而言Glide會(huì)輕好多移国,上手快吱瘩,使用簡單,配置方便迹缀,而且從加載速度和性能方面不相上下使碾。對于一般的APP來說Glide是一個(gè)不錯(cuò)的選擇,如果是專業(yè)的圖片APP那么Fresco還是必要的祝懂。

Hybrid App中實(shí)現(xiàn)的主要技術(shù)native組件與js的數(shù)據(jù)交互的理解以及實(shí)現(xiàn)

Android WebviewJavaScriptBridge
https://blog.csdn.net/alwaysgoalong/article/details/77837405

Gradle 多渠道打包

事件分發(fā)

https://blog.csdn.net/guolin_blog/article/details/9097463

Android開發(fā)與藝術(shù)一定要好好看完看懂部逮。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市嫂易,隨后出現(xiàn)的幾起案子兄朋,更是在濱河造成了極大的恐慌,老刑警劉巖怜械,帶你破解...
    沈念sama閱讀 222,807評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件颅和,死亡現(xiàn)場離奇詭異,居然都是意外死亡缕允,警方通過查閱死者的電腦和手機(jī)峡扩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來障本,“玉大人教届,你說我怎么就攤上這事响鹃。” “怎么了案训?”我有些...
    開封第一講書人閱讀 169,589評(píng)論 0 363
  • 文/不壞的土叔 我叫張陵买置,是天一觀的道長。 經(jīng)常有香客問我强霎,道長忿项,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,188評(píng)論 1 300
  • 正文 為了忘掉前任城舞,我火速辦了婚禮轩触,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘家夺。我一直安慰自己脱柱,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,185評(píng)論 6 398
  • 文/花漫 我一把揭開白布拉馋。 她就那樣靜靜地躺著榨为,像睡著了一般。 火紅的嫁衣襯著肌膚如雪椅邓。 梳的紋絲不亂的頭發(fā)上柠逞,一...
    開封第一講書人閱讀 52,785評(píng)論 1 314
  • 那天昧狮,我揣著相機(jī)與錄音景馁,去河邊找鬼。 笑死逗鸣,一個(gè)胖子當(dāng)著我的面吹牛合住,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播撒璧,決...
    沈念sama閱讀 41,220評(píng)論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼透葛,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了卿樱?” 一聲冷哼從身側(cè)響起僚害,我...
    開封第一講書人閱讀 40,167評(píng)論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎繁调,沒想到半個(gè)月后萨蚕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,698評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蹄胰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,767評(píng)論 3 343
  • 正文 我和宋清朗相戀三年岳遥,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片裕寨。...
    茶點(diǎn)故事閱讀 40,912評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡浩蓉,死狀恐怖派继,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情捻艳,我是刑警寧澤驾窟,帶...
    沈念sama閱讀 36,572評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站讯泣,受9級(jí)特大地震影響纫普,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜好渠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,254評(píng)論 3 336
  • 文/蒙蒙 一昨稼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧拳锚,春花似錦假栓、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,746評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至杆烁,卻和暖如春牙丽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背兔魂。 一陣腳步聲響...
    開封第一講書人閱讀 33,859評(píng)論 1 274
  • 我被黑心中介騙來泰國打工烤芦, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人析校。 一個(gè)月前我還...
    沈念sama閱讀 49,359評(píng)論 3 379
  • 正文 我出身青樓构罗,卻偏偏與公主長得像,于是被迫代替她去往敵國和親智玻。 傳聞我的和親對象是個(gè)殘疾皇子遂唧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,922評(píng)論 2 361

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