安卓 每日一題 2020年4月

Android4月1日題: 什麼是代理模式

答:爲其他對象提供一種代理以控制對這個對象的訪問,它主要解決在直接訪問對象時帶來的問題, 比如說:要訪問的對象在遠程的機器上。在面向對象系統中,有些對象由於某些原因(比如對象 創建開銷很大,或者某些操作需要安全控制,或者需要進程外的訪問),直接訪問會給使用者或 者系統結構帶來很多麻煩,我們可以在訪問此對象時加上一個對此對象的訪問層


Android4月2日題: 當兩個對象的hashcode相同會發生什麼?

答:如果是在存儲階段,兩個對象如果作爲key,他們的hashCode相同,就會引起hash 碰撞,面對hash碰撞,jdk1.7 採用的是鏈表來解決,相同的hashCode的對象會放到一個鏈表中,在鏈表中,通過對比對象本身和hashcode 是否都相同來判斷是否是同一個節點,如果有不同,那麼就不是同一個節點,如果相同,那就是同一個節點,而在jdk 1.8中採用的不是鏈表,而是採用紅黑樹來解決衝突。


Android4月3日題:ViewModel和AndroidViewModel區別是什麼?

答:如果需要在viewmodel中使用上下文,則應使用AndroidViewModel,因爲它包含應用程序上下文(以檢索上下文調用getApplication()),否則使用常規ViewModel.


Android4月7日題:GC算法有哪些

答:標記-清除算法:一般爲老年代的垃圾回收算法,效率高,但可能產生大量內存碎片

標記-整理算法:parallel old收集器與serial old收集器使用了此算法,解決了標記清除的內存碎片問題,但是效率低

複製算法:一般用於新生代的垃圾回收。會導致可用內存縮小;需要額外空間做分配擔保(老年代)


Android4月8日題:LiveDataBus優點

答:LiveDataBus的實現及其簡單,相對EventBus複雜的實現,LiveDataBus只需要一個類就可以實現

LiveDataBus可以減小APK包的大小
LiveDataBus只依賴Android官方組件LiveData,本身實現只一個類。EventBus 57Kb、RxJava 2.2M
LiveDataBus 依賴方支持更好
LiveDataBus只依賴Android官方組件LiveData,相比RxBus依賴的RxJava和RxAndroid,依賴方支持更好
LiveDataBus具有生命週期感知


Android4月9日題:什麼是內存抖動?如何避免

答:非常頻繁的創建與銷燬對象。這可能會導致大量內存碎片的產生,同時GC頻繁的工作會影響程序流暢性。所以需要避免在頻繁調用的方法中new對象,同時也可以使用對象池來管理需要經常創建的小對象完成複用,如:Handler的message池


Android4月10日每日一題:講下View的繪製流程?

答:View的工作流程主要是指measure、layout、draw這三大流程,即測量、佈局和繪製,其中measure確定View的測量寬/高,layout確定View的最終寬/高和四個頂點的位置,而draw則將View繪製到屏幕上

View的繪製過程遵循如下幾步:

繪製背景 background.draw(canvas)
繪製自己(onDraw)
繪製 children(dispatchDraw)
繪製裝飾(onDrawScollBars)


Android4月13日題:MotionEvent是什麼?包含幾種事件?什麼條件下會產生?

答:MotionEvent是手指接觸屏幕後所產生的一系列事件。典型的事件類型有如下:ACTION_DOWN:手指剛接觸屏幕

ACTION_MOVE:手指在屏幕上移動

ACTION_UP:手指從屏幕上鬆開的一瞬間

ACTION_CANCELL:手指保持按下操作,並從當前控件轉移到外層控件時觸發

正常情況下,一次手指觸摸屏幕的行爲會觸發一系列點擊事件,考慮如下幾種情況:點擊屏幕後鬆開,事件序列:DOWN→UP

點擊屏幕滑動一會再鬆開,事件序列爲DOWN→MOVE→…→MOVE→UP


Android4月14日題:(靈魂拷問)你的職業發展之路是怎樣的?未來有什麼打算嗎?(開放性問題,說出你的想法)

參考:Android開發的職業發展路徑,基本上有兩條:技術專精路線和技術轉產品路線。

1、技術爲王。晉升軌跡:Android初級開發程序員—中級—高級–軟件架構師–系統架構師–項目經理–首席技術官

2、由技術向產品方向轉型。晉升軌跡:Android初級開發程序員—中級—高級–軟件架構師–系統架構師–產品經理–產品總監

其實還有第三條路線,就是自己創業,但不管哪個方向,對自己的未來提前客觀的做出職業發展規劃是有必要的,還是那就老話,機會是留給有準備的人的。

最後,希望每個人都有一個好的職業生涯,祝最後夢想都實現~

(很多人會說這個東西還有答案呀,在這裏說一下這個並非是答案,只是一個大佬給予的參考)


Android4月15日題:如何解決View的事件衝突 ?舉個開發中遇到的例子 ?

參考答案:

常見開發中事件衝突的有ScrollView與RecyclerView的滑動衝突、RecyclerView內嵌同時滑動同一方向

滑動衝突的處理規則:對於由於外部滑動和內部滑動方向不一致導致的滑動衝突,可以根據滑動的方向判斷誰來攔截事件。

對於由於外部滑動方向和內部滑動方向一致導致的滑動衝突,可以根據業務需求,規定何時讓外部View攔截事件,何時由內部View攔截事件。

對於上面兩種情況的嵌套,相對複雜,可同樣根據需求在業務上找到突破點。

滑動衝突的實現方法:外部攔截法:指點擊事件都先經過父容器的攔截處理,如果父容器需要此事件就攔截,否則就不攔截。具體方法:需要重寫父容器的onInterceptTouchEvent方法,在內部做出相應的攔截。

內部攔截法:指父容器不攔截任何事件,而將所有的事件都傳遞給子容器,如果子容器需要此事件就直接消耗,否則就交由父容器進行處理。具體方法:需要配合requestDisallowInterceptTouchEvent方法


Android4月16日題:Jni靜態註冊的弊端是什麼

參考答案:

1.編寫不方便,JNI 方法名字必須遵循規則且名字很長;

2.編寫過程步驟多,不方便;
3.程序運行效率低,因爲初次調用native函數時需要根據根據函數名在JNI層中搜索對應的本地函數,然後建立對應關係,這個過程比較耗時;


Android4月17日題:您在項目開發中使用的屏幕適配方案是什麼樣的?

參考答案:

1.使用dimens

2.使用谷歌的自動佈局或百分比佈局

3.自定義適配佈局文件

4.對於手機與平板的適配,使用Layout目錄

5.切入源碼層實現


Android4月20日題:isAssignableFrom 與 instanceof 的區別

參考答案:

isAssignableFrom是用來判斷一個類Class1和另一個類Class2是否相同或是另一個類的超類或接口。

instanceof是用來判斷一個對象實例是否是一個類或接口的或其子類子接口的實例。


Android4月21日題:Butterknife和GsonFormat這類代碼自動生成是如何實現的?

答:需要使用AS插件開發技術
1.在Intellij中新建項目
2.新建Action以設置菜單
3.在Action關聯的類中進行功能開發開發完成生成對應的插件包


Android4月22日題:自定義View有哪幾種?

答:1、自定義組合控件

多個控件組合成爲一個新的控件,方便多處複用

2、繼承系統View控件

繼承自TextView等系統控件,在系統控件的基礎功能上進行擴展

3、繼承View

不復用系統控件邏輯,繼承View進行功能定義

4、繼承系統ViewGroup

繼承自LinearLayout等系統控件,在系統控件的基礎功能上進行擴展

5、繼承ViewViewGroup

不復用系統控件邏輯,繼承ViewGroup進行功能定義


Android4月23日題:v3簽名key和v2還有v1有什麼區別

答:在v1版本的簽名中,簽名以文件的形式存在於apk包中,這個版本的apk包就是一個標準的zip包,V2和V1的差別是V2是對整個zip包進行簽名,而且在zip包中增加了一個apk signature block,裏面保存簽名信息。
v2版本簽名塊(APK Signing Block)本身又主要分成三部分:
SignerData(簽名者數據):主要包括簽名者的證書,整個APK完整性校驗hash,以及一些必要信息
Signature(簽名):開發者對SignerData部分數據的簽名數據
PublicKey(公鑰):用於驗籤的公鑰數據
v3版本簽名塊也分成同樣的三部分,與v2不同的是在SignerData部分,v3新增了attr塊,其中是由更小的level塊組成。每個level塊中可以存儲一個證書信息。前一個level塊證書驗證下一個level證書,以此類推。最後一個level塊的證書,要符合SignerData中本身的證書,即用來簽名整個APK的公鑰所屬於的證書


Android4月24日題:弱引用應用場景

參考答案:1. 如果一個對象是偶爾的使用,並且希望在使用時隨時就能獲取到,但又不想響此對象的垃圾收集,那麼應該用 Weak Reference 來記住此對象。

  1. 想引用一個對象,但是這個對象有自己的生命週期,你不想介入這個對象的生命週期,這時候就應該用弱引用,這個引用不會在對象的垃圾回收判斷中產生任何附加的影響。

Android4月27日題:JVM運行時數據區棧區中的棧幀主要由哪些部份組成?它們的作用分別是?

參考答案:

1.局部變量表
用於存放八大基本數據類型和對象的引用
2.操作數棧
存放操作數的一塊臨時空間
3.動態鏈接
存放編譯時不能確定方法入口的方法的地址
需要在運行時來保證方法調用的正確性
4.方法出口(返回地址)


Android4月28日題:你知道觀察者設計模式和 發佈訂閱設計模式的區別嗎?

參考答案:

表面上看:

1、觀察者模式中,兩個角色:觀察者和被觀察者

2、發佈訂閱模式中,三個角色:發佈者,訂閱者,經紀人

深層次的看:

1、觀察者模式:觀察者和被觀察者,是松耦合的關係

2、發佈訂閱模式:發佈和訂閱者是完全不存在耦合的

從使用層面上看:

1、觀察者模式:多用於單個應用內部,維護的是單一事件對應多個依賴的

event -> [obj1,obj2,obj3,…]
2、發佈訂閱模式:多用於跨應用的模式,比如我們說的消息的中間件,維護的是多個事件以及依賴的

event1 -> [obj1,obj2,…] event2 -> [obj1,obj3,…]


Android4月29日題:請簡述 retrofit 中,一個方法的執行流程

參考答案:

首先我們通過我們 create 出來的 retrofit 實例來調用接口方法。所有的 interface 方法都會在 java 動態代理機制的作用下,調用一個匿名類 new InvocationHandler 中的 invoke。在 invoke 中,會根據我們想調用的方法 method 構造出一個 serviceMethod,然後調用 serviceMethod.callAdapter.adapt(okHttpCall) 作爲返回結果。

構造 serviceMethod 的時候,會根據 interface 中 method 的的返回類型,構造出 converter 和 callAdapter。其中, converter 一般使用 gson converter。gson converter 可以自動將服務器返回的 json 數據轉化成 java 中的 model 類的實例。callAdapter 絕大多數的實現方式是在構造函數中接收一個 okHttpCall 實例,然後將 enqueue 和 execute 委託給這個 okHttpCall 實例來執行。okHttpCall 在獲取到服務器數據之後,會利用 serviceMethod.toResponse(body) 來對數據進行轉化。其中,轉化的時候便利用了 converter。數據轉化完成後,封裝成 Response ,傳遞給調用方。其中 R 就是我們的數據類。


Android4月30日題:AOP實際常見的場景有哪些?

參考答案:
統計埋點
日誌打印
數據校驗
行爲攔截
性能監控
動態權限申請


轉載自 安卓2020年4月每日一題

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章