學(xué)習(xí)筆記(二)

自定義控件

繼承現(xiàn)有的控件,如textview礁哄,edittext,

繼承容器控件溪北,一般是幾個(gè)控件組合起來(lái)組成一個(gè)新的控件桐绒,把它們之間的邏輯封裝起來(lái),對(duì)外通過(guò)回調(diào)提供新的功能刻盐。

繼承view掏膏。自定義View一般有三個(gè)步驟,首先是測(cè)量敦锌,然后布局馒疹,最后繪制,對(duì)應(yīng)的三個(gè)方法是onMeasure()乙墙,onLayout()颖变,onDraw()。

網(wǎng)絡(luò)優(yōu)化:

1听想、用Gzip來(lái)壓縮請(qǐng)求和回應(yīng)腥刹,以減少傳輸數(shù)據(jù)量;

2汉买、圖片加載衔峰,后臺(tái)提供縮略圖和原圖的路徑,比如頭像和用戶(hù)上傳的圖片,在用戶(hù)瀏覽時(shí)加載縮略圖垫卤,當(dāng)用戶(hù)點(diǎn)擊查看大圖時(shí)加載原圖威彰;

3、弱網(wǎng)絡(luò)測(cè)試和優(yōu)化穴肘,設(shè)置模擬器歇盼。斷點(diǎn)續(xù)傳,新建一個(gè)類(lèi)記錄下載文件的url评抚,開(kāi)始位置豹缀,長(zhǎng)度,當(dāng)前進(jìn)度慨代,把文件下載的進(jìn)度保存進(jìn)數(shù)據(jù)庫(kù)邢笙。下載文件時(shí)先從數(shù)據(jù)庫(kù)查詢(xún)是否有下載記錄,如果有就繼續(xù)下載鱼响,如果沒(méi)有鸣剪,就新建線(xiàn)程,先獲取文件的大小丈积,然后在本地新建一個(gè)同樣大小的文件筐骇,通過(guò)randomAccessFile來(lái)寫(xiě)進(jìn)下載內(nèi)容,同時(shí)更新下載進(jìn)度江滨。

靜態(tài)代理和動(dòng)態(tài)代理的區(qū)別

靜態(tài)代理由程序員編寫(xiě)代理類(lèi)代碼铛纬。動(dòng)態(tài)代理類(lèi),在程序運(yùn)行時(shí)唬滑,運(yùn)用反射機(jī)制動(dòng)態(tài)創(chuàng)建而成告唆。

synchronized?和volatile?關(guān)鍵字的區(qū)別?

1.volatile本質(zhì)是在告訴jvm當(dāng)前變量在寄存器(工作內(nèi)存)中的值是不確定的,需要從主存中讀染堋擒悬;synchronized則是鎖定當(dāng)前變量,只有當(dāng)前線(xiàn)程可以訪(fǎng)問(wèn)該變量稻艰,其他線(xiàn)程被阻塞住懂牧。

2.volatile僅能使用在變量級(jí)別;synchronized則可以使用在變量尊勿、方法僧凤、和類(lèi)級(jí)別的

3.volatile僅能實(shí)現(xiàn)變量的修改可見(jiàn)性,不能保證原子性元扔;而synchronized則可以保證變量的修改可見(jiàn)性和原子性

4.volatile不會(huì)造成線(xiàn)程的阻塞躯保;synchronized可能會(huì)造成線(xiàn)程的阻塞。

5.volatile標(biāo)記的變量不會(huì)被編譯器優(yōu)化澎语;synchronized標(biāo)記的變量可以被編譯器優(yōu)化

非靜態(tài)內(nèi)部類(lèi)會(huì)持有外部對(duì)象的引用途事,而靜態(tài)內(nèi)部類(lèi)不會(huì)持有外部對(duì)象的引用验懊。因?yàn)榉庆o態(tài)內(nèi)部類(lèi)方法的調(diào)用需要依賴(lài)外部對(duì)象的創(chuàng)建。

MVP和MVC的區(qū)別和優(yōu)缺點(diǎn)

MVP中View層和Model層沒(méi)有直接通信盯孙,而是通過(guò)Persenter來(lái)間接通信

MVC中View層和Model層直接通信鲁森。

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

1、使用MVP代碼架構(gòu)振惰,對(duì)代碼實(shí)施分層管理。

2垄懂、如果界面發(fā)生變化骑晶,只要修改View就可以了,不需要修改Persenter和Model層草慧。

3桶蛔、同樣如果邏輯層或數(shù)據(jù)層需要修改,只修改對(duì)應(yīng)的Persenter和Model就可以了漫谷。

4仔雷、Activity職責(zé)更明確

MVP缺點(diǎn):

1、增加了代碼類(lèi)的數(shù)量舔示。

2碟婆、由于進(jìn)行了代碼三層劃分,函數(shù)的調(diào)用棧變深了惕稻,如果開(kāi)發(fā)人沒(méi)沒(méi)有很清楚地了解每一層的功能竖共,可能會(huì)導(dǎo)致其他層次的代碼亂入,從而沒(méi)有達(dá)到MVP充分解藕各層的目的俺祠。

注解

元注解:注解的注解

@Target 指定注解所適用的對(duì)象范圍

@Retention 注解的生命周期 RetentionPolicy.SOURCE公给, RetentionPolicy.CLASS, RetentionPolicy.RUNTIME

RetentionPolicy.SOURCE(源碼注解)蜘渣,注解保留在源代碼中淌铐,但是編譯的時(shí)候會(huì)被編譯器所忽略。編譯時(shí)不處理注解蔫缸,但自定義注解處理器時(shí)可以處理此注解 腿准。使用場(chǎng)景:使用@IntDef代替枚舉。

RetentionPolicy.CLASS(編譯時(shí)注解)捂龄,這是默認(rèn)的policy释涛。注解會(huì)被保留在class文件中,但是在運(yùn)行時(shí)期間就不會(huì)識(shí)別這個(gè)注解倦沧。使用場(chǎng)景:可以自定義注解處理器來(lái)處理注解生成更多源碼唇撬。三種注解都可以通過(guò)注解處理器來(lái)處理。

RetentionPolicy.RUNTIME(運(yùn)行時(shí)注解)展融,注解會(huì)被保留在class文件中窖认,同時(shí)運(yùn)行時(shí)期間也會(huì)被識(shí)別。使用場(chǎng)景:使用反射機(jī)制獲取注解信息。

多進(jìn)程使用場(chǎng)景

1扑浸、類(lèi)似音樂(lè)類(lèi)烧给、跑步健身類(lèi)、手機(jī)管家類(lèi)等長(zhǎng)時(shí)間需要在后臺(tái)運(yùn)行的應(yīng)用喝噪。

2础嫡、為了加大一個(gè)應(yīng)用程序可使用的內(nèi)存,可以通過(guò)多進(jìn)程來(lái)獲得多份內(nèi)存空間酝惧。

這些應(yīng)用的特點(diǎn)就是榴鼎,當(dāng)用戶(hù)切到別的應(yīng)用,或者關(guān)掉手機(jī)屏幕的時(shí)候晚唇,應(yīng)用本身的核心模塊還在正常運(yùn)行巫财,提供服務(wù)。如果因?yàn)槭謾C(jī)內(nèi)存過(guò)低哩陕,或者是進(jìn)程重要性降低平项,導(dǎo)致應(yīng)用被殺掉,后臺(tái)服務(wù)停止悍及,對(duì)于這些應(yīng)用來(lái)說(shuō)闽瓢,就是滅頂之災(zāi)。合理利用多進(jìn)程并鸵,將核心后臺(tái)服務(wù)模塊和其他UI模塊進(jìn)行分離鸳粉,保證應(yīng)用能更穩(wěn)定的提供服務(wù),從而提升用戶(hù)體驗(yàn)园担。

多進(jìn)程還有一種非常有用的場(chǎng)景届谈,就是多模塊應(yīng)用。比如我做的應(yīng)用大而全弯汰,里面肯定會(huì)有很多模塊艰山,假如有地圖模塊、大圖瀏覽咏闪、自定義WebView等等(這些都是吃?xún)?nèi)存大戶(hù))曙搬,一個(gè)成熟的應(yīng)用一定是多模塊化的。首先多進(jìn)程開(kāi)發(fā)能為應(yīng)用解決了OOM問(wèn)題鸽嫂,因?yàn)锳ndroid對(duì)內(nèi)存的限制是針對(duì)于進(jìn)程的纵装,所以,當(dāng)我們需要加載大圖之類(lèi)的操作据某,可以在新的進(jìn)程中去執(zhí)行橡娄,避免主進(jìn)程O(píng)OM。

動(dòng)畫(huà)

1癣籽、補(bǔ)間動(dòng)畫(huà) 通過(guò)透明度挽唉、縮放滤祖、移動(dòng)、旋轉(zhuǎn)的變化來(lái)實(shí)現(xiàn)動(dòng)畫(huà)效果瓶籽。

2匠童、幀動(dòng)畫(huà) 多張圖片按一定順序播放形成動(dòng)畫(huà)。

3塑顺、屬性動(dòng)畫(huà) 在一定時(shí)間內(nèi)汤求,通過(guò)不斷地對(duì)值進(jìn)行改變,并使用該值來(lái)改變view的屬性严拒,從而實(shí)現(xiàn)動(dòng)畫(huà)效果首昔。

屬性動(dòng)畫(huà)和補(bǔ)間動(dòng)畫(huà)的區(qū)別

1、補(bǔ)間動(dòng)畫(huà)不改變view的屬性糙俗,只改變視角效果,屬性動(dòng)畫(huà)可改變view的屬性预鬓。

2巧骚、補(bǔ)間動(dòng)畫(huà)只能實(shí)現(xiàn)透明度、縮放格二、移動(dòng)和旋轉(zhuǎn)的動(dòng)畫(huà)效果劈彪,屬性動(dòng)畫(huà)可以實(shí)現(xiàn)更豐富的動(dòng)畫(huà)效果。

應(yīng)用的啟動(dòng)過(guò)程

冷啟動(dòng):當(dāng)啟動(dòng)應(yīng)用時(shí)顶猜,后臺(tái)沒(méi)有該應(yīng)用的進(jìn)程沧奴,這時(shí)系統(tǒng)會(huì)重新創(chuàng)建一個(gè)新的進(jìn)程分配給該應(yīng)用。

冷啟動(dòng)的特點(diǎn):因?yàn)橄到y(tǒng)會(huì)重新創(chuàng)建一個(gè)新的進(jìn)程分配給它长窄,所以會(huì)創(chuàng)建和初始化Application滔吠,在創(chuàng)建和初始化它的Launch Activity(onCreate onMesure onLayout,ondraw),最后展示在界面上

熱啟動(dòng):當(dāng)啟動(dòng)應(yīng)用時(shí)挠日,后臺(tái)存在該應(yīng)用的進(jìn)程(back鍵疮绷,home鍵,應(yīng)用退出嚣潜,但是沒(méi)有銷(xiāo)毀)冬骚,從已有的進(jìn)程中啟動(dòng)

熱啟動(dòng)的特點(diǎn):從已有的進(jìn)程中啟動(dòng),不需要?jiǎng)?chuàng)建和初始化Application ,直接創(chuàng)建和初始化它的Launch Activity

兩者區(qū)別:后臺(tái)進(jìn)程是否存在相應(yīng)的進(jìn)程懂算,創(chuàng)建進(jìn)程是耗時(shí)操作

冷啟動(dòng)的情況(分配進(jìn)程->創(chuàng)建和初始化Application->創(chuàng)建和初始化Launch Activity)

一只冻、Launcher通過(guò)Binder進(jìn)程間通信機(jī)制通知ActivityManagerService, 它要啟動(dòng)一個(gè)Activity计技;

二喜德、ActivityManagerService通過(guò)Binder進(jìn)程間通信機(jī)制通知Launcher進(jìn)入Paused狀態(tài);

三酸役、 Launcher通過(guò)Binder進(jìn)程間通信機(jī)制通知ActivityManagerService住诸,它已經(jīng)準(zhǔn)備就緒進(jìn)入Paused狀態(tài)驾胆, 于是ActivityManagerService就創(chuàng)建一個(gè)新的進(jìn)程,用來(lái)啟動(dòng)一個(gè)ActivityThread實(shí)例贱呐, 即將要啟動(dòng)的Activity就是在這個(gè)ActivityThread實(shí)例中運(yùn)行丧诺;

四、 ActivityThread通過(guò)Binder進(jìn)程間通信機(jī)制將一個(gè)ApplicationThread類(lèi)型的Binder對(duì)象傳遞給ActivityManagerService奄薇, 以便以后ActivityManagerService能夠通過(guò)這個(gè)Binder對(duì)象和它進(jìn)行通信驳阎;

五、 ActivityManagerService通過(guò)Binder進(jìn)程間通信機(jī)制通知ActivityThread馁蒂, 現(xiàn)在一切準(zhǔn)備就緒呵晚,它可以真正執(zhí)行Activity的啟動(dòng)操作了。

activity的啟動(dòng)過(guò)程

Activity的啟動(dòng)過(guò)程分從桌面啟動(dòng)App的根Activity沫屡,和當(dāng)前Activity啟動(dòng)Activity饵隙。

Activity的啟動(dòng)過(guò)程,執(zhí)行了四次的IPC沮脖。第一次由發(fā)起方調(diào)用金矛,activity調(diào)用startActivityForResult()啟動(dòng)新的activity時(shí),通過(guò)ActivityManager進(jìn)行一次IPC勺届,發(fā)送到ActivityManagerService驶俊。ActivityManagerService給當(dāng)前Activity發(fā)送暫停的信號(hào),這也是一個(gè)IPC過(guò)程免姿,ActivityThread通過(guò)Handler來(lái)處理這個(gè)暫停操作饼酿。Activity暫停后,會(huì)第三次執(zhí)行IPC通知ActivityManagerService可以啟動(dòng)新的Activity胚膊。ActivityManagerService第四次執(zhí)行IPC通過(guò)進(jìn)程啟動(dòng)Activity故俐。啟動(dòng)activity的一個(gè)重要工具是instrumentation。它主要負(fù)責(zé)activity的創(chuàng)建澜掩,啟動(dòng)和生命周期的回調(diào)购披。

Glide的優(yōu)勢(shì)

1、可配置度高肩榕,自適應(yīng)度高

2刚陡、支持多種數(shù)據(jù)源,本地株汉,網(wǎng)絡(luò)筐乳,assets,gif在glide是支持的

3乔妈、高效緩存蝙云,支持memory和disk圖,默認(rèn)使用二級(jí)緩存

4路召、生成周期集成到glide

5勃刨、高效處理bitmap:使用bimtp pool復(fù)用bitmap

6波材、圖片加載過(guò)程可以監(jiān)聽(tīng)

TCP 協(xié)議 https://blog.csdn.net/javasxl/article/details/82774803

TCP的三次握手

第一次握手,客戶(hù)端發(fā)起連接身隐,請(qǐng)求報(bào)文的SYN(同步)位置1廷区,客戶(hù)端進(jìn)入SYN_SENT(同步發(fā)送)狀態(tài)

第二次握手,服務(wù)端接收到連接請(qǐng)求贾铝,如果同意連接隙轻,就發(fā)送確認(rèn)報(bào)文,SYN位置1垢揩,ACK位置1玖绿,服務(wù)端進(jìn)入SYN_RCVD(同步接收)狀態(tài)

第三次握手,客戶(hù)端接收到確認(rèn)報(bào)文叁巨,客戶(hù)端發(fā)送確認(rèn)報(bào)文斑匪,ACK位置1,這時(shí)客戶(hù)端進(jìn)入建立連接狀態(tài)锋勺。服務(wù)端接收到報(bào)文也進(jìn)入建立連接狀態(tài)秤标。三次握手完成

為什么要進(jìn)入三次握手

為了防止失效了的請(qǐng)求連接又傳到服務(wù)端,而產(chǎn)生錯(cuò)誤宙刘。客戶(hù)端發(fā)送的請(qǐng)求連接報(bào)文在網(wǎng)點(diǎn)滯留了牢酵,因而客戶(hù)端認(rèn)為報(bào)文失效悬包,就又發(fā)起第二次請(qǐng)求連接,這次服務(wù)端接收到報(bào)文馍乙,并建立了連接布近。這時(shí)滯留的請(qǐng)求報(bào)文到達(dá)服務(wù)端,服務(wù)端也返回確認(rèn)報(bào)文丝格,但由于客戶(hù)端認(rèn)為該報(bào)文已失效撑瞧,就不會(huì)對(duì)這個(gè)報(bào)文進(jìn)行應(yīng)答,也就沒(méi)有建立連接显蝌。

四次揮手

客戶(hù)端和服務(wù)端都可以主動(dòng)發(fā)起斷開(kāi)预伺。

以客戶(hù)端為例,第一次揮手曼尊,客戶(hù)端發(fā)送FIN報(bào)文酬诀,F(xiàn)IN位置1,客戶(hù)端進(jìn)入FIN_WAIT_1(結(jié)束等待1)狀態(tài)

第二次揮手骆撇,服務(wù)端接收到FIN報(bào)文瞒御,返回應(yīng)答報(bào)文,ACK位置1神郊,客戶(hù)端接收到應(yīng)答報(bào)文后進(jìn)入FIN_WAIT_2狀態(tài)

這時(shí)服務(wù)端還有數(shù)據(jù)發(fā)送給客戶(hù)端肴裙,把這些數(shù)據(jù)發(fā)送完后

第三次揮手趾唱,服務(wù)端發(fā)送FIN報(bào)文,F(xiàn)IN位置1蜻懦,ACK位置1甜癞,服務(wù)端進(jìn)入LAST_ACK(最后確認(rèn))狀態(tài)

第四次揮手,客戶(hù)端收到FIN報(bào)文阻肩,返回應(yīng)答報(bào)文带欢,ACK位置1,客戶(hù)端進(jìn)入TIME_WAIT狀態(tài)烤惊,等待2個(gè)MSL后進(jìn)入CLOSE狀態(tài)乔煞,服務(wù)端應(yīng)答報(bào)文,進(jìn)入CLOSE狀態(tài)柒室。1個(gè)MSL(最長(zhǎng)報(bào)文段壽命)為2分鐘渡贾,2個(gè)MSL為4分鐘。

為什么要等待2個(gè)MSL

客戶(hù)端發(fā)送FIN確認(rèn)報(bào)文后雄右,無(wú)法確認(rèn)服務(wù)端是否接收到報(bào)文空骚。如果服務(wù)端沒(méi)有接收到這個(gè)報(bào)文,就會(huì)重新發(fā)送FIN請(qǐng)求報(bào)文擂仍,然后客戶(hù)端重新發(fā)關(guān)確認(rèn)報(bào)文囤屹。這個(gè)客戶(hù)端等待的時(shí)間就為2個(gè)MSL。

為什么說(shuō)TCP是可靠的連接

因?yàn)門(mén)CP的三次握手過(guò)程逢渔,很大程度防止了錯(cuò)誤連接的產(chǎn)生肋坚,所以TCP是可靠的。接收方是按順序接收數(shù)據(jù)肃廓。

為什么說(shuō)TCP是面向的連接

因?yàn)門(mén)CP在傳輸數(shù)據(jù)前要建立連接智厌,結(jié)束傳輸也要斷開(kāi)連接。

UDP是無(wú)連接的盲赊、不可靠的一種數(shù)據(jù)傳輸協(xié)議铣鹏,TCP是面向連接的。

UDP 是數(shù)據(jù)格式基于數(shù)據(jù)報(bào)哀蘑,TCP 是面向字節(jié)流诚卸。

UDP 是不處理堵塞,應(yīng)用需要發(fā)绘迁,就會(huì)發(fā)送惨险。TCP 還擁有堵塞控制,TCP 會(huì)根據(jù)網(wǎng)絡(luò)環(huán)境調(diào)整發(fā)包的頻率脊髓。

UDP 支持多播和廣播

TCP協(xié)議所需資源多辫愉,TCP首部需20個(gè)字節(jié)(不算可選項(xiàng)),UDP首部字段只需8個(gè)字節(jié)将硝。

TCP有流量控制和擁塞控制恭朗,UDP沒(méi)有屏镊,網(wǎng)絡(luò)擁堵不會(huì)影響發(fā)送端的發(fā)送速率

Socket 是對(duì) TCP/IP 協(xié)議族的一種封裝,是應(yīng)用層與TCP/IP協(xié)議族通信的中間軟件抽象層痰腮。有基于TCP的流套接字而芥,和基于UDP的數(shù)據(jù)報(bào)套接字

長(zhǎng)連接

HTTP數(shù)據(jù)傳輸完成了還保持TCP連接不斷開(kāi)

Binder機(jī)制

Binder是進(jìn)程間通信的一種方式。Binder通信采用C/S架構(gòu)膀值,包括Client棍丐,Server,ServiceManager和Binder驅(qū)動(dòng)沧踏。Client為使用服務(wù)的進(jìn)程歌逢,Server為提供服務(wù)的進(jìn)程,ServiceManager的作用是作為Client和Server的連接橋梁翘狱,Client可以通過(guò)ServiceManager獲取Server中Binder實(shí)體的引用秘案,從而使用Server提供的服務(wù)。Client潦匈,Server阱高,ServiceManager運(yùn)行在用戶(hù)空間,Binder驅(qū)動(dòng)運(yùn)行在內(nèi)核空間茬缩。前三者通過(guò)通過(guò)Binder驅(qū)動(dòng)進(jìn)行交互赤惊。

Client調(diào)用bindService()方法,通過(guò)binder從ServiceManager找到相應(yīng)的服務(wù)端凰锡,并返回服務(wù)端的binder對(duì)象荐捻,client就是通過(guò)這個(gè)binder與服務(wù)端通信。client調(diào)用binder的transact()方法寡夹,把數(shù)據(jù)寫(xiě)入data變量,服務(wù)端通過(guò)onTransact()方法接收數(shù)據(jù)厂置,處理完后把結(jié)果寫(xiě)入reply菩掏,回傳給Client。

如何提高代碼質(zhì)量

盡量不要過(guò)于復(fù)雜的嵌套昵济≈浅瘢可以使用<include>,<merge>访忿,<ViewStub>瞧栗。使用viewStub可以實(shí)現(xiàn)延時(shí)加載(懶加載)

注意內(nèi)存泄露和內(nèi)存溢出的發(fā)生,同時(shí)使用LeakCanary查找內(nèi)存泄漏的地方海铆。

使用monkey工具來(lái)對(duì)app進(jìn)行壓力測(cè)試迹恐。

使用合適的設(shè)計(jì)模式,達(dá)到代碼低耦合卧斟。

插件化的原理

這個(gè)功能核心的地方是DexClassloader殴边。使用DexClassLoader加載我們生成的插件憎茂,然后通過(guò)反射得到AssetsManager,再生成Resources锤岸,這三個(gè)步驟就可以訪(fǎng)問(wèn)到插件中的類(lèi)和資料文件竖幔。然后創(chuàng)建一個(gè)Activity作為宿主,改造里面的一些方法是偷,比如生命同期相關(guān)的方法拳氢,使之調(diào)用插件里的對(duì)應(yīng)的方法。當(dāng)中要注意的是不能調(diào)用系統(tǒng)的setContetnView()來(lái)設(shè)置界面蛋铆,要使用插件的resources取得布局ID馋评,并實(shí)例化,最后setContentView()戒职。根據(jù)需求栗恩,我們的APP要支持多種語(yǔ)言,那原來(lái)的一些功能就需要改成洪燥,比如說(shuō)中文的搜索算法就不能用于英文磕秤。我的做法是把原來(lái)算法的類(lèi)替換成新的類(lèi)。系統(tǒng)是有個(gè)PathClassLoader的捧韵,他的父ClassLoader是BootClassLoader市咆,我在他們之間插入一個(gè)自定義的ClassLoader,根據(jù)ClassLoader的雙親委托機(jī)制再来,PathClassLoader加載類(lèi)之前會(huì)調(diào)用父CloassLoader的loadClass()方法蒙兰,如果沒(méi)有加載過(guò)父ClassLoader會(huì)調(diào)用findClass方法加載。利用這個(gè)機(jī)制芒篷,在自定義的ClassLoader搜变,復(fù)寫(xiě)findClass()方法,把原來(lái)要加載的類(lèi)名替換成新的類(lèi)名针炉,并從插件中加載挠他,這樣就達(dá)到替換的作用。同時(shí)這個(gè)框架支持多個(gè)插件篡帕。

eventbus

注冊(cè)過(guò)程第一步是獲得類(lèi)中監(jiān)聽(tīng)的方法列表殖侵。使用了注解+反射的方案。調(diào)用register()方法時(shí)镰烧,通過(guò)傳入的object獲得Class拢军,從METHOD_CACHE獲取方法列表,這個(gè)列表記錄了這個(gè)類(lèi)里的方法名怔鳖,線(xiàn)程模式茉唉,參數(shù)類(lèi)型,是否粘性方法,和優(yōu)化級(jí)赌渣,如果找到就返回列表魏铅,沒(méi)有找到就通過(guò)反射,找到這個(gè)類(lèi)里用@Subscribe修飾的方法坚芜,并存入列表中返回览芳。

第二步是把列表中的方法登記到被監(jiān)聽(tīng)類(lèi)的列表中。獲得被監(jiān)聽(tīng)類(lèi)的監(jiān)聽(tīng)列表鸿竖,并把該方法插入到監(jiān)聽(tīng)列表中沧竟。

第三步,如果監(jiān)聽(tīng)方法是粘性方法缚忧,就從緩存中查看是否有粘性數(shù)據(jù)可以處理悟泵,有則使用該方法處理數(shù)據(jù)。

post闪水。先得到event的類(lèi)糕非,再?gòu)谋O(jiān)聽(tīng)的MAP中獲得處理event的列表。然后根據(jù)5種ThreadMode球榆,選擇不同的處理方式朽肥。POSTING就是直接執(zhí)行,MAIN和MAIN_ORDERED都是在主線(xiàn)程執(zhí)行持钉,不同點(diǎn)在于如果調(diào)用者和執(zhí)行者都在主線(xiàn)程衡招,MAIN是直接執(zhí)行,而MAIN_ORDERED是把處理方式和數(shù)據(jù)封裝成MESSAGE每强,然后通過(guò)HANDLER發(fā)送到消息隊(duì)列始腾,等待執(zhí)行空执,這樣MAIN方式會(huì)阻塞event的調(diào)用者調(diào)用處理方法浪箭,MAIN_ORDERED是event調(diào)用者統(tǒng)一把處理方法延后處理,不會(huì)阻塞調(diào)用者辨绊。BACKGROUND和ASYNC的處理雖然都是使用了線(xiàn)程池奶栖,的不同在于,BACKGROUND是插入到執(zhí)行的隊(duì)列后會(huì)判斷線(xiàn)程池是否在處理event邢羔,如果不是的話(huà),執(zhí)行線(xiàn)程池的excute方法桑孩。如果是的話(huà)拜鹤,線(xiàn)程池會(huì)從隊(duì)列中取出這個(gè)事件并處理,ASYNC會(huì)把每個(gè)event封裝成runnable并通過(guò)線(xiàn)程池執(zhí)行流椒。

unregister敏簿。選擇根據(jù)object找到event的類(lèi),再根據(jù)event的類(lèi)找到處理方法,判斷處理方法里的subcribe和object是否一致惯裕,是的話(huà)就刪除温数。最后清除保存object,event的MAP蜻势。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末撑刺,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子握玛,更是在濱河造成了極大的恐慌够傍,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件挠铲,死亡現(xiàn)場(chǎng)離奇詭異冕屯,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)拂苹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)安聘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人瓢棒,你說(shuō)我怎么就攤上這事浴韭。” “怎么了音羞?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵囱桨,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我嗅绰,道長(zhǎng)舍肠,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任窘面,我火速辦了婚禮翠语,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘财边。我一直安慰自己肌括,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布酣难。 她就那樣靜靜地躺著谍夭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪憨募。 梳的紋絲不亂的頭發(fā)上紧索,一...
    開(kāi)封第一講書(shū)人閱讀 51,631評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音菜谣,去河邊找鬼珠漂。 笑死晚缩,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的媳危。 我是一名探鬼主播荞彼,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼待笑!你這毒婦竟也來(lái)了鸣皂?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤滋觉,失蹤者是張志新(化名)和其女友劉穎签夭,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體椎侠,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡第租,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了我纪。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片慎宾。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖浅悉,靈堂內(nèi)的尸體忽然破棺而出趟据,到底是詐尸還是另有隱情,我是刑警寧澤术健,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布汹碱,位于F島的核電站,受9級(jí)特大地震影響荞估,放射性物質(zhì)發(fā)生泄漏咳促。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一勘伺、第九天 我趴在偏房一處隱蔽的房頂上張望跪腹。 院中可真熱鬧,春花似錦飞醉、人聲如沸冲茸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)轴术。三九已至,卻和暖如春钦无,著一層夾襖步出監(jiān)牢的瞬間逗栽,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工铃诬, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留祭陷,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓趣席,卻偏偏與公主長(zhǎng)得像兵志,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子宣肚,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

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