Android5月7日題: 在使用 HashMap 的時候,用 String 做 key 有什麼好處?
參考答案:
HashMap 內部實現是通過 key 的 hashcode 來確定 value 的存儲位置,因爲字符串是不可變的,所以當創建字符串時,它的 hashcode 被緩存下來,不需要再次計算,所以相比於其他對象更快。
Android5月8日題: 請說一說OkHttp與Retrofit 的區別與聯繫是怎樣的?
參考答案: OkHttp和Retrofit都是目前流行網絡開源框架
封裝不同:
-
Retrofit封裝了具體的請求,線程切換以及數據轉換。
retrofit通過使用代理,外觀,策略模式對okhttp進行了封裝 -
OkHttp 是基於Http協議封裝的一套請求客戶端
職責不同:
-
Retrofit主要負責應用層面的封裝,面向開發者,方便使用,比如請求參數,響應數據的處理,錯誤處理等等。
-
OkHttp主要負責socket部分的優化與封裝,比如網絡訪問,多路複用,buffer緩存,數據壓縮等等。
Android5月12日題: 談談你認爲MVVM的一些特點?
**參考答案:**雙向數據綁定 在雙向數據綁定模式中數據流是雙向的,當業務上的數據發生改變之後,ui上的數據得到實時更新。當用戶通過交互改變了數據的時候,數據的改變也能夠自動更新到業務代碼的數據中去。在Android中數據綁定用的是DataDinding,谷歌官網推出的實現數據和ui綁定的框架。
Android5月13日題: 解釋一下 JNI中全局引用和局部引用的區別和使用
參考答案:
全局引用
通過 NewGlobalRef 和 DeleteGlobalRef 方法創建和釋放一個全局引用。全局引用能在多個線程中被使用,且不會被GC 回收,只能手動釋放。
局部引用
通過NewLocalRef 和 DeleteLocalRef 方法創建和釋放一個局部引用。
局部引用只在創建它的native 方法中有效,包括其調用的其它函數中有效。因此我們不能寄望於將一個局部引用直接保存在全局變量中下次使用(請使用全局引用實現該需求)。
我們可以不用刪除局部引用,它們會在native 方法返回時全部自動釋放,但是建議對於不再使用的局部引用手動釋放,避免內存過度使用。
擴展:弱全局引用
通過 NewWeakGlobalRef 和 DeleteWeakGlobalRef創建和釋放一個弱全局引用。弱全局引用類似於全局引用,唯一的區別是它不會阻止被 GC 回收。
Android5月14日題: Android JetPack之Compose到底是什麼?
參考答案:
是安卓原生開發過程中,未來新的一種UI視圖方式了,不像以前使用五大布局方式來完成UI視圖方式,而以後會是用Kotlin來寫UI視圖了,其實Compose非常像Flutter。
5月15日題: Android多渠道打包有幾種方式,區別是什麼?
參考答案:
多渠道打包方案很多,總體來說主要就兩種方式,一種是使用android gradle插件提供的flavor配置不同的變體,注入渠道信息,另一種是利用APK文件構成,注入渠道信息。兩種方式,前者基於官方提供的插件,功能更全面,能夠配置不同的包名、圖標等各種資源,但是每一個渠道包都會經歷完整的打包構建流程,因此在渠道包多的情況下會很慢;後者無法根據渠道修改資源,但是不需要重打包重簽名。
Android5月18日題: Java實現熱修復主要有哪幾種?
參考答案: Java類替換:參照Multidex原理。因爲需要進行類替換,所以如果類已經被加載過了,那就不能再被修復,因此需要重啓生效。(Tinker)
Java代理重定向:參照Intsnt Run 原理。對每個類中在編譯爲class後插入邏輯控制執行代碼時是否需要重定向到補丁中的代碼(美團Rubost)
Android5月19日題: ViewPager緩存的頁面爲什麼容易導致內存泄漏?
參考答案:
ViewPager 通過setOffscreenLimit來設置緩存的頁面數量,一般默認會緩存2幀數據,而如果用戶設置的值越大,緩存的數據就會越多,這些緩存的數據是用ArrayList保存的,這個時候這些緩存的頁面就會一直存在於內存中,所以,這樣的結果就是導致內存無法釋放,因此,一般情況下重寫fragmentStatePagerAdapter,然後在getItem中返回你需要的fragment來解決這個內存泄漏。具體可以看https://blog.csdn.net/k_hello/article/details/82996162,親測有效
Android5月20日題: R文件中資源的整型數分別是什麼意思,例如:0x7f060003
參考答案:
-
0x7f060003格式是:0xpptteeee,p代表的是package,t代表的是type,e代表的是entry。
-
Package ID 包ID,系統爲0x01,應用程序資源爲0x7f。
-
Type ID 資源的類型ID,資源的類型有animator、anim、color等等,每一種都會被賦予一個ID。
-
Entry ID 資源在其所屬的資源類型中所出現的次序。
Android5月21日題: Android中主要的ClassLoader有哪些,他們分別是做什麼的?
參考答案:
Android有兩個主要的classloader,分別是PathClassLoader、DexClassLoader。它們都繼承自於BaseDexClassLoader。PathClassLoader主要是用來加載系統類和主Dex中的類,而DexClassLoader主要是用來加載其他Dex文件的類。
Android5月22日題: 在MVP模式開發中,您是如何感知Activity或Fragment的生命週期的?
參考答案:
方法1:自己實現一個感知類,作爲Activity或Fragment中的成員變量,在需要感知的其它類中傳入該成員
方法2:使用Jetpack提供的Lifecycle框架實現。
Android5月25日題: 進程的回收策略是什麼?
**參考答案:**Low memory killer:通過一些比較複雜的評分機制,對進程進行打分,然後將分數高的進程判定爲bad進程,殺死並釋放內存
Android5月29日題: CAS是什麼
參考答案: CAS的全稱是Compare And Swap,比較與交換,是Java保證原子性的一種重要方法,也是一種樂觀鎖的實現方式。
在更新值時,需要先比較當前的值是否與舊值相同,如果相同,則更新數據,否則自旋。
轉載自 安卓2020年5月每日一題