Android 3月2日題: onMeasure是幹什麼的?
答案:
onMeasure方法主要是用於度量ViewGroup的子view的大小同時確定和保存自己ViewGroup的大小,將xml中的佈局信息進行計算,計算出他們需要顯示的佈局數據。
Android 3月3日題:
手機的運行內存越來越大,爲什麼加載個大圖片就可能導致OOM?
答案:
因爲安卓對虛擬機的堆內存做了硬性限制,當進程申請的空間超過閾值時,就會拋出OOM異常(這個閾值可以是48M、24M、16M等,視機型而定)
Android 3月4日題:
EventBus是單例的,但是爲什麼默認構造函數是public的呢?
答案:
EventBus可能有多條總線,訂閱者註冊到不同線上的 EventBus,通過不同的實例來發送數據,不同的 EventBus 是相互隔離開的,訂閱者就都只會收到註冊到該線上的事件 。
Android 3月5日題:
Jni靜態註冊和動態註冊
答案:
靜態註冊:
通過 JNIEXPORT 和 JNICALL 兩個宏定義聲明,Java + 包名 + 類名 + 方法名形式的函數名。不好的地方就是方法名太長了。
動態註冊:
通常在 JNI_OnLoad 方法中通過 RegisterNatives 方法註冊,可以不再遵從固定的命名寫法(當然爲了代碼容易理解,名稱還是儘量和 Java 中保持一致)
Android 3月6日題:
Android進程的優先級有哪幾級?
答案:
前臺進程、可見進程、服務進程、後臺進程、空進程
Android3月9日題:
父容器調用哪個方法可以攔截子View的事件?爲什麼?
答案:
調用onInterceptTouchEvent()並返回true。因爲該方法返回true後,會導致變量 intercepted = true,從而導致不會走後面分發事件的代碼。
Android3月10日題:Binder爲什麼安全性高?
答案:
1.爲每個APP分配不同UID,通過UID鑑別進程身份;
2.即支持實名Binder,又支持匿名Binder;
Android3月11日題:AIDL 中 in,out,inout 的區別?
答案:
AIDL中的定向 tag 表示了在跨進程通信中數據的流向,其中 in 表示數據只能由客戶端流向服務端, out 表示數據只能由服務端流向客戶端,而 inout 則表示數據可在服務端與客戶端之間雙向流通。其中,數據流向是針對在客戶端中的那個傳入方法的對象而言的。in 爲定向 tag 的話表現爲服務端將會接收到一個那個對象的完整數據,但是客戶端的那個對象不會因爲服務端對傳參的修改而發生變動;out 的話表現爲服務端將會接收到那個對象的參數爲空的對象,但是在服務端對接收到的空對象有任何修改之後客戶端將會同步變動;inout 爲定向 tag 的情況下,服務端將會接收到客戶端傳來對象的完整信息,並且客戶端將會同步服務端對該對象的任何變動。
Android3月12日題:Android程序員在職業生涯中如何規劃自己?(今天是開放性的每日一題,大家可自由發揮快來說出你的想法)
答案:
1.選擇比努力更重要,選擇有兩個方向,第一是選擇企業,第二是選擇技術方向
2.節奏很重要,通俗的話就是,工作要有計劃和時間觀念,不能一味地通過延長時間來完成工作,儘量保持固定的上下班時間和睡眠時間,而且要安排一些鍛鍊在生活中只有掌控自己的節奏才能在工作和健康的生活中達到一個平衡的度)
3.未雨綢繆很重要,天有不測風雲人有旦夕禍福
4.創建自己的總體計劃,創建總體計劃時,最大限度地發揚長避短,然後把這個總體計劃應用於自己必須解決的每個問題中。
(關於職業規劃的問題沒有對錯,因爲每個人的路都不一樣,所以這個只能給大家作爲一些參考,希望可以給你一些啓發)
Android3月13日題:你是如何理解MVP模式的?
答案:
MVP架構由MVC發展而來。在MVP中,M代表Model,V代表View,P代表Presenter。
模型層(Model):主要是獲取數據功能,業務邏輯和實體模型。
視圖層(View):對應於Activity或Fragment,負責視圖的部分展示和業務邏輯用戶交互
控制層(Presenter):負責完成View層與Model層間的交互,通過P層來獲取M層中數據後返回給V層,使得V層與M層間沒有耦合。
在MVP中 ,Presenter層完全將View層和Model層進行了分離,把主要程序邏輯放在Presenter層實現,Presenter與具體的View層(Activity)是沒有直接的關聯,是通過定義接口來進行交互的,從而使得當View層(Activity)發生改變時,Persenter依然可以保持不變。View層接口類只應該只有set/get方法,及一些界面顯示內容和用戶輸入,除此之外不應該有多餘的內容。絕不允許View層直接訪問Model層,這是與MVC最大區別之處,也是MVP核心優點。
Android3月16日題: retrofit的原理
答案:
通過java接口以及註解來描述網絡請求,並用動態代理的方式,在調用接口方法前後(before/after)注入自己的方法,before通過接口方法和註解生成網絡請求的request,after通過client調 用相應的網絡框架(默認okhttp)去發起網絡請求,並將返回的response通過converterFactorty轉換成相應的數據model,最後通過calladapter轉換成其他數據方式(如rxjavaObservable)
Android3月17日題:retrofit爲什麼要使用動態代理
答案:
因爲1個靜態代理只服務1種類型的目標對象
若要服務多類型的目標對象,則需要爲每種目標對象都實現一個靜態代理對象 ,在目標對象較多的情況下,若採用靜態代理,則會出現 靜態代理對象量多、代碼量大,從而導致代碼複雜的問
題,而動態代理只需要1個動態代理類就可以解決創建多個靜態代理的問題,避免重複、多餘代碼 更強的靈活性設計動態代理類(DynamicProxy)時,不需要顯式實現與目標對象類
(RealSubject)相同的接口,而是將這種實現推遲到程序運行時由JVM來實現
在使用時(調用目標對象方法時)纔會動態創建動態代理類 & 實例,不需要事先實例化
Android3月18日題:raw文件夾和assets文件夾有什麼區別
答案:
raw : Android會自動的爲這目錄中的所有資源文件生成一個ID,這意味着很容易就可以訪問到這個資源,甚至在xml 中都是可以訪問的,使用ID訪問速度是最快的。
assets : 不會生成ID,只能通過AssetManager訪問,xml中不能訪問,訪問速度會慢些,不過操作更加方便。
Android3月19日題:什麼是零拷貝技術?
答案:
"零拷貝"中的"拷貝"是操作系統在I/O操作中,將數據從一個內存區域複製到另外一個內存區域. 而"零"並不是指0次複製, 更多的是指在用戶態和內核態之前的複製是0次。
淺析Linux中的零拷貝技術
Android3月20日題:Fragment默認緩存一幀的原理是什麼?
答案:
Fragment其實是沒有默認緩存的,之所以有這個說法是因爲大家都是採用ViewPager+ Fragment的方案,然後用一個宿主Activity+多個Fragment的方案,在這個方案中,ViewPager是默認緩存一幀頁面的,而這個頁面是Fragment,因而就有了fragment默認緩存一幀的說法。
Android3月23日題:動態代理的缺點是什麼?
答案:效率低
相比靜態代理中直接調用目標對象方法,動態代理則需要先通過Java反射機制 從而 間接調用目標對象方法
應用場景侷限
因爲Java 的單繼承特性(每個代理類都繼承了 Proxy 類),即只能針對接口 創建 代理類,不能針對類 創建代理類
即只能動態代理 實現了接口的類
Android3月24日題:Android Studio插件開流程是怎樣的?
答案:
-
在Intelij中新建項目
-
新建Action以設置菜單
-
在Action關聯的類中進行功能開發
-
開發完成生成對應的插件包
Android3月25日題:怎麼定位 NDK中的問題和錯誤
答案:
一般在開發階段的話,我們可以通過log 來定位和分析問題。
如果是上線狀態(即關閉了基本的log),我們可以藉助 NDK 提供的 addr2line 工具和
objdump工具來定位錯誤。詳情:
so動態庫崩潰問題定位(addr2line與objdump)
其它還可以使用 C/C++ 的一些分析工具。
Android3月26日題: retrofit是如何把接口轉換爲請求
答案:
- 首先,通過method把它轉換成ServiceMethod。
- 然後,通過serviceMethod,args獲取到okHttpCall對象。
- 3.最後,再把okHttpCall進一步封裝並返回Call對象。
Android3月27日題:AOP的優點是什麼?一般在什麼地方使用?
答案:
AOP是 Aspect Oriented Programming的縮寫,中譯文爲面向切向編程
-
優點:降低耦合度、提高可重用性、提高可讀性。
-
使用地方:動態權限申請、登入框架、日誌打印、線程切換、埋點統計等等
Android3月30日題:ART是什麼?
答案:ART是在Android4.0引入並在Android5.0中設爲默認解決方案的主要特性之一。ART取代了Dalvik,但是前者與後者仍然保持了字節碼級的兼容。ART的主要特徵之一就是安裝時對應用的AOT編譯。這種方式的主要優點就是優化 產生的本地代碼性能更好,執行起來需要更少的電量。劣勢在於安裝文件所需的空間和時間。在Android 6.0中, 大的應用需要數分鐘才能安裝完。
但是在Android N開發者預覽版包含了一個混合模式的運行時。應用在安裝時不做編譯,而是解釋字節碼,所以可以快速啓動。ART中代碼在執行期間被分析,分析結果保存起來。然後,當設備空轉和充電的時候,ART會執行鍼 對“熱代碼”進行編譯,生成app image文件,並且在啓動時一次性把它們加載到緩存。
Android3月31日題:我們可以使用自定義的對象作爲鍵嗎?
答:可以,但是我們需要自定義它的equals方法和hashcode方法