安卓 每日一題 2020年2月

Android 2月2日題:android圖片佔用的內存大小怎麼計算?

答案:分辨率像素點大小。但是分辨率不一定是原圖分辨率,而像素點一般就ARGB_8888(4字節)與RGB_565(2字節)。android系統會根據圖片不同來源決定加載圖片的分辨率。圖片來自res,則分辨率=原圖橫向分辨率(設備dpi/目錄對於dpi)原圖縱向分辨率(設備dpi/目錄對於dpi);圖片來自磁盤、文件等,按照原圖分辨率加載。


Android 2月3日題:android創建多線程方式

答案:Handler+Thread、AsyncTask、ThreadPoolExecutor、IntentService


Android 2月4日題:hashmap怎麼處理hash碰撞?

答案:hashmap利用“拉鍊法”處理HashCode的碰撞問題;將鍵值對傳遞給put方法時,他調用鍵對象的hashCode()方法來計算hashCode,然後找到bucket(哈希桶)位置來存儲對象;當用get方法獲取對象時,通過鍵對象的equals()方法找到正確的鍵值對,然後返回值對象。HashMap使用鏈表來解決碰撞問題,當碰撞發生了,對象將會存儲在鏈表的下一個節點中。hashMap在每個鏈表節點存儲鍵值對對象。當兩個不同的鍵卻有相同的hashCode時,他們會存儲在同一個bucket位置的鏈表中。鍵對象的equals()來找到鍵值對。


Android 2月5日題:插件化和熱修復區別

答案:插件化顧名思義,更多是想把需要實現的模塊或功能當做一個獨立的提取出來,減少宿主的規模,當需要使用到相應的功能時再去加載相應的模塊。熱修復則是從修復bug的角度出發,強調的是在不需要二次安裝應用的前提下修復已知的bug。


Android 2月6日題:一個Thread可以有幾個Looper?幾個Handler?

答案:由於使用了ThreadLocal機制,所以註定了一個線程只能有一個Looper,但Handler可以new無數個。


Android 2月8日題:你瞭解重新調整HashMap大小存在什麼問題嗎?

答案:當hashMap中的節點數超過閾值的時候,就會自動擴容,擴容的時候就會調整hashMap的大小,一旦調整了hashMap的大小就會導致之前的hashCode計算出來的hash表中下標無效,所以所有的節點都需要重新hash運算,結果就是帶來時間上的浪費。因此我們要儘量避免hashMap調整大小,所以我們使用hashMap的時候要給hashMap設置一個默認值,這個默認值要大於我們hashMap中存放的節點數。
默認16,擴容因子0.75,即當發生碰撞且數目大於16*0.75時發生擴容


Android 2月9日題:你用過HashMap嗎?什麼是HashMap?你爲什麼用到它?

答案:HashMap基於hashing原理,我們通過put()和get()方法儲存和獲取對象。當我們將鍵值對傳遞給put()方法時,它調用鍵對象的hashCode()方法來計算hashcode,讓後找到bucket位置來儲存值對象。當獲取對象時,通過鍵對象的equals()方法找到正確的鍵值對,然後返回值對象。HashMap使用鏈表來解決碰撞問題,當發生碰撞了,對象將會儲存在鏈表的下一個節點中。 HashMap在每個鏈表節點中儲存鍵值對對象


Android 2月10日題:Message可以如何創建,哪種效果最好?爲什麼?

答案: 一共有3種方法:Messagemessage = Message.obtain(); Message message = handler.obtainMessage(); Messagemessage = new Message();需要說明的是:前兩種都是從消息池中返回一個新的實例,能有效避免重複創建Message,因爲Message內部採用了享元設計模式,避免了因爲反覆new Message而帶來的內存抖動。


Android 2月11日題:談談你對 JNI 和 NDK 的理解

答案:JNI 是Java Native Interface的縮寫,即 Java 的本地接口。JNI存在的目的就是作爲一個翻譯語言,用於java和C/C++進行相互調用,也就是說,JNI和Android沒有直接關係,而是和java語言有關係

NDK:NDK 是Native Development Kit的縮寫,是 Android 的工具開發包。作用是更方便和快速開發 C/C++ 的動態庫,並自動將動態庫與應用一起打包到 apk。也就是,我們可以通過JNI接口來寫C/C++的代碼,然後又用C/C++代碼來調用動態庫(.so)來實現Android中需要大量物理模型運算的功能。NDK 是屬於 Android 的,與 Java 無直接關係。


Android 2月13題:主線程中的Looper的輪詢死循環爲何沒有阻塞主線程

答案:因爲Android 的是由事件驅動的,looper.loop() 不斷地接收事件、處理事件,每一個點擊觸摸或者說Activity的生命週期都是運行在 Looper.loop() 的控制之下,如果它停止了,應用也就停止了。只能是某一個消息或者說對消息的處理阻塞了 Looper.loop(),而不是 Looper.loop() 阻塞它。


Android 2月14題:可以在子線程直接new一個Handler嗎?怎麼做?

答案:首先, 如果是創建子線程的Handler, 需要三步:Looper.prepare(); Handler handler = newHandler(); Looper.loop();因爲子線程的handler需要準備looper,同時要啓動Looper.loop(),只有這樣handler的機制才能夠正常運行。

其次,如果是創建主線程中的Handler,那就需要這樣處理:Handler mainHandler = new Handler(Looper.getMainLooper());


Android 2月15題:View中getwidth和getMeasuredWidth的值的區別是什麼?

答案:getWidth()方法是需要在View中調用了onLayout之後才能執行,否則得到的結果會是錯誤的,表示的是view顯示後的寬度。而getMeasuredWidth方法是獲取的執行了onMeasure之後的就能獲取到值,表示的是度量後的view的寬度。


Android 2月17題:常見的屏幕適配方案有哪些?

答案:使用dimens使用谷歌的自動佈局或百分比佈局

自定義適配佈局文件

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


Android 2月19題:java中自定義註解的元註解有哪些?

答案:1.@Retention: 定義註解的保留策略

2.@Target:定義註解的作用目標

3.@Document:說明該註解將被包含在javadoc中

4.@Inherited:說明子類可以繼承父類中的該註解


Android 2月20題:JetPack中是如何監聽Activity生命週期?

答案:可以使用Lifecycles組件去感知Activity的生命週期

Activity因爲已經實現了LifecycleOwner接口,能直接作爲被觀察者,所以可以直接在上面添加觀察者,觀察者類實現LifecycleObserver接口,以實現對Activity生命週期的監聽。


Android 2月21題:爲什麼String, Interger這樣的wrapper類適合作爲鍵?

答案:第一個是習慣,我們習慣用String和Interger代表一個變量的id。第二個原因是,String 和Interger已經自己實現了equals方法,和hashcode方法,這兩個方法是做鍵key 必須要實現的方法


Android 2月22題:Dagger2中的Singleton與Scope註解你是如何理解的?

答案:表示單例,Scope的特殊衍生註解,作爲Scope的一種模版形式,儘量不直接使用。

Scope註解,可用來限定通過Module和Inject方式創建實例的生命週期能夠與目標類的生命週期相同,其實就是起到一個提醒和管理的作用。


Android 2月24題:MVVM架構中databinding的作用是?

答案:Databinding用於在VIEW層與MODEL層之間實現UI與數據的雙向邦定功能。


Android 2月25題:JNI 線程間數據怎麼互相訪問

答案:瞭解這個問題首先要知道JNI 中全局引用和局部引用的區別:全局引用能在多個線程中被使用,且不會被 GC 回收,只能手動釋放。局部引用只在創建它的 native 方法中有效,包括其調用的其它函數中有效。因此我們不能寄望於將一個局部引用直接保存在全局變量中下次使用(請使用全局引用實現該需求)。因此,JNI線程間數據相互訪問需要使用全局引用來實現。


Android 2月26題:什麼是MeasureSpec?

答案:一個MeasureSpec封裝了父佈局傳遞給子佈局的佈局要求,每個MeasureSpec代表了一組寬度和高度的要求。一個MeasureSpec由大小和模式組成。它有三種模式:UNSPECIFIED(未指定),父元素不對自元素施加任何束縛,子元素可以得到任意想要的大小;EXACTLY(完全),父元素決定自元素的確切大小,子元素將被限定在給定的邊界裏而忽略它本身大小;AT_MOST(至多),子元素至多達到指定大小的值。


Android 2月27題:ViewPager緩存機制是怎樣的?

答案:ViewPager內部維持了一個ArrayList,這個list用於緩存VIewPager需要顯示的頁面,默認情況下ViewPager會緩存兩幀頁面,顯示一幀頁面。緩存是ViewPager的一個最大的特點,緩存是在populate函數中進行的,這個函數全程掌握着adapter來適配顯示頁面。


Android 2月28題:我們可以使用CocurrentHashMap來代替Hashtable嗎?

答案:Hashtable和ConcurrentHashMap有什麼分別呢?它們都可以用於多線程的環境,但是當Hashtable的大小增加到一定的時候,性能會急劇下降,因爲迭代時需要被鎖定很長的時間。因爲ConcurrentHashMap引入了分割(segmentation),不論它變得多麼大,僅僅需要鎖定map的某個部分,而其它的線程不需要等到迭代完成才能訪問map。簡而言之,在迭代的過程中,ConcurrentHashMap僅僅鎖定map的某個部分,而Hashtable則會鎖定整個map。


Android 2月29題:什麼是hook技術?

答案:用反射和動態代理來調用Android源碼,通過反射Android源碼從而修改代碼的執行流程,就像是一個鉤子一樣。Hook技術的難點在於找到一個合適的hook點,所以需要對源碼非常瞭解,深入調查,很小心纔可以。


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

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