安卓 每日一題 2020年1月

Android 1月2日題:SharedPrefrences的apply和commit有什麼區別?

答案:apply沒有返回值而commit返回boolean表明修改是否提交成功。

apply是將修改數據原子提交到內存, 而後異步真正提交到硬件磁盤, 而commit是同步的提交到硬件磁盤.

Android 1月3日題:SurfaceView和View的區別?

答案:View需要在UI線程對畫面進行刷新,而SurfaceView可在子線程進行頁面的刷新

SurfaceView在底層已實現雙緩衝機制,因此SurfaceView比View更適用於需要頻繁刷新、刷新時數據處理量很大的頁面(如視頻播放界面)


Android 1月6日題:常用設計模式有哪些?

答案:創建型模式,共五種:工廠方法模式、抽象工廠模式、單例模式、建造者模式、原型模式。

結構型模式,共七種:適配器模式、裝飾器模式、代理模式、外觀模式、橋接模式、組合模式、享元模式。

行爲型模式,共十一種:策略模式、模板方法模式、觀察者模式、迭代子模式、責任鏈模式、命令模式、備忘錄模式、狀態模式、訪問者模式、中介者模式、解釋器模式。


Android 1月7日題:OkHttp與Retrofit 的區別與聯繫是怎樣的?

答案:OkHttp和Retrofit都是目前流行網絡開源框架

封裝不同:

Retrofit封裝了具體的請求,線程切換以及數據轉換。

retrofit通過使用代理,外觀,策略模式對okhttp進行了封裝

OkHttp 是基於Http協議封裝的一套請求客戶端

職責不同:

Retrofit主要負責應用層面的封裝,面向開發者,方便使用,比如請求參數,響應數據的處理,錯誤處理等等。

OkHttp主要負責socket部分的優化與封裝,比如網絡訪問,多路複用,buffer緩存,數據壓縮等等。


Android 1月8日題:你是如何理解Java中強引用、軟引用、弱引用以及虛引用?

答案:(1)強引用:一般的Object obj = new Object() ,就屬於強引用。

(2)軟引用:一些有用但是並非必需,用軟引用關聯的對象,系統將要發生OOM之前,這些對象就會被回收。

一個程序用來處理用戶提供的圖片。如果將所有圖片讀入內存,這樣雖然可以很快的打開圖片,但內存空間使用巨大,一些使用較少的圖片浪費內存空間,需要手動從內存中移除。如果每次打開圖片都從磁盤文件中讀取到內存再顯示出來,雖然內存佔用較少,但一些經常使用的圖片每次打開都要訪問磁盤,代價巨大。這個時候就可以用軟引用構建緩存。

(3)弱引用:一些有用(程度比軟引用更低)但是並非必需,用弱引用關聯的對象,只能生存到下一次垃圾回收之前,GC發生時,不管內存夠不夠,都會被回收。

注意:軟引用 SoftReference和弱引用 WeakReference,可以用在內存資源緊張的情況下以及創建不是很重要的數據緩存。當系統內存不足的時候,緩存中的內容是可以被釋放的。實際運用(WeakHashMap、ThreadLocal)

(4)虛引用(幽靈引用),作用只是GC回收時得到一個通知


Android 1月9日題:android classloader使用的雙親委託機制是什麼?

答案:雙親委派模型要求除了頂層的啓動類加載器外,其餘的類加載器都應當有自己的父類加載器。這裏類加載器之間的父子關係一般不會以繼承(Inheritance)的關係來實現,而是都使用組合(Composition)關係來複用父加載器的代碼。

雙親委派模型的工作過程是:如果一個類加載器收到了類加載的請求,它首先不會自己去嘗試加載這個類,而是把這個請求委派給父類加載器去完成,每一個層次的類加載器都是如此,因此所有的加載請求最終都應該傳送到頂層的啓動類加載器中,只有當父加載器反饋自己無法完成這個加載請求(它的搜索範圍中沒有找到所需的類)時,子加載器纔會嘗試自己去加載。


Android 1月10日題:LayoutInflater 的 inflate 方法的幾個參數分別代表什麼?

答案:第一個參數爲佈局文件ID

方法用三個參數時,root的參數是否爲空,決定了我們要不要沿用root的佈局屬性,attachToRoot是否爲true,決定了是否將我們的layout作爲子View添加進去。

方法用兩個參數時,root既決定了是否要沿用root的佈局屬性,也決定了是否要將我們的layout作爲子View添加進去。


Android 1月13日題:FragmentPagerAdapter 與FragmentStatePagerAdapter 的區別與使用場景?

答案:FragmentPagerAdapter 的每個 Fragment 會持久的保存在 FragmentManager 中,只要用戶可以返回到頁面中,它都不會被銷燬。因此適用於那些數據相對靜態的頁,Fragment 數量也比較少的那種;FragmentStatePagerAdapter 只保留當前頁面,當頁面不可見時,該 Fragment 就會被消除,釋放其資源。因此適用於那些 數據動態性較大、 佔用內存較多,多 Fragment 的情況;


Android 1月14日題:Activity 的啓動模式

答案:standard 標準模式: 每次啓動一個 Activity 都會重新創建一個新的實例,不管這個實例是否已經存在,此模式的 Activity 默認會進入啓動它的 Activity 所屬的任務棧中;

singleTop 棧頂複用模式: 如果新 Activity 已經位於任務棧的棧頂,那麼此 Activity 不會被重新創建,同時會回調 onNewIntent方法,如果新 Activity 實例已經存在但不在棧頂,那麼Activity 依然會被重新創建;

singleTask 棧內複用模式: 只要 Activity 在一個任務棧中存在,那麼多次啓動此 Activity 都不會重新創·建實例,並回調onNewIntent 方法,此模式啓動 Activity A,系統首先會尋找是否存在 A 想要的任務棧,如果不存在,就會重新創建一個任務棧,然後把創建好 A 的實例放到棧中;

singleInstance單實例模式: 這是一種加強的 singleTask模式,具有此種模式的 Activity 只能單獨地位於一個任務棧中,且此任務棧中只有唯一一個實例;


Android 1月15日題:volatile關鍵字的作用

答案:volatile讓變量每次在使用的時候,都從主存中取。而不是從各個線程的“工作內存”,保證了變量的可見性,不能保證對volatile變量操作的原子性

並且能禁止指令重排序。


Android 1月16日題:簡述Android類加載器

答案:在Android開發中,不管是插件化還是組件化,都是基於Android系統的類加載器ClassLoader來設計的。只不過Android平臺上虛擬機運行的是Dex字節碼,一種對class文件優化的產物,傳統Class文件是一個Java源碼文件會生成一個.class文件,而Android是把所有Class文件進行合併、優化,然後再生成一個最終的class.dex,目的是把不同class文件重複的東西只需保留一份,在早期的Android應用開發中,如果不對Android應用進行分dex處理,那麼最後一個應用的apk只會有一個dex文件。


Android 1月17日題:Java中守護線程和用戶線程的區別?

答案:java中線程氛圍守護線程Daemon和用戶線程User。可以通過Thread.setDaemon(true)設置爲守護線程,但是必須在start之前調用。

Daemon是爲其他線程提供服務,如果全部用戶線程結束,Daemon沒有服務對象,也就沒有繼續運行程序的必要了。

守護線程最典型的應用就是 GC (垃圾回收器)


Android 1月20日題:TCP爲什麼要三次握手?

答案: client發送了第一個連接的請求報文,但是由於網絡不好,這個請求沒有立即到達服務端,而是在某個網絡節點中滯留了,直到某個時間纔到達server,本來這已經是一個失效的報文,但是server端接收到這個請求報文後,還是會想client發出確認的報文,表示同意連接。假如不採用三次握手,那麼只要server發出確認,新的建立就連接了,但其實這個請求是失效的請求,client是不會理睬server的確認信息,也不會向服務端發送確認的請求,但是server認爲新的連接已經建立起來了,並一直等待client發來數據,這樣,server的很多資源就沒白白浪費掉了,採用三次握手就是爲了防止這種情況的發生,server會因爲收不到確認的報文,就知道clien我們需要設計一個自定操作符,主要有兩種情況:

一、如果我們的操作符是作爲第一個事件源頭,可以通過繼承Observable類進行下游對接。

二、如果我們的操作符是作爲變換過程中間的部份,可以通過繼承AbstractObservableWithUpstream來進行上游與下游的對接過程。


Android 1月21日題:如何避免過度繪製

答案:一.移除默認的window背景

二.移除佈局裏面不必要的背景

三.減少佈局層級

四.自定義佈局使用clipRect()裁剪進行部分繪製

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

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