【移動應用開發技術】被問到Glide 源碼等突破性問題不好意思我都會_第1頁
【移動應用開發技術】被問到Glide 源碼等突破性問題不好意思我都會_第2頁
【移動應用開發技術】被問到Glide 源碼等突破性問題不好意思我都會_第3頁
【移動應用開發技術】被問到Glide 源碼等突破性問題不好意思我都會_第4頁
【移動應用開發技術】被問到Glide 源碼等突破性問題不好意思我都會_第5頁
已閱讀5頁,還剩3頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

【移動應用開發技術】被問到Glide源碼等突破性問題,不好意思我都會

之前在一次面試中被問到數據庫.網絡請求.IntentService.view繪制.內存泄漏.OOM.動畫框架.自定義view.Glide源碼.屬性動畫等等一系列的問題,雖然都答上來了,但是還是有一些細節性的東西沒有注意得到。

之前在一次面試中被問到數據庫.網絡請求.IntentService.view繪制.內存泄漏.OOM.動畫框架.自定義view.Glide源碼.屬性動畫等等一系列的問題,雖然都答上來了,但是還是有一些細節性的東西沒有注意得到。回來以后吧很多知識整理成了一份PDF,還是比較全面的(^▽^)從基礎到進階。含有BATJ.字節跳動面試專題,算法專題,高端技術專題,混合開發專題,java面試專題,Android,Java小知識,到性能優化.線程.View.OpenCV.NDK等應有盡有。還有輔之相關的視頻+學習筆記(更多完整項目下載。未完待續。源碼。圖文知識后續上傳github。)可以點擊關于我聯系我獲取完整PDF(VX:m讀懂題目。如果碰到問題比較模糊的時候可以適當問問面試官。配合面試官來面試:面試是一個相互了解的過程,要充分利用面試的題目和時間把自己的能力和技術展現出來,面試官能夠看到你的真實技術。直接操作SQL語句:SQliteDatabase.execSQL(sql);面向對象的操作方式:SQLiteDatabase.insert(table,nullColumnHack,ContentValues);一般外部數據庫文件可能放在SD卡或者res/raw或者assets目錄下面。寫一個DBManager的類來管理,數據庫文件搬家,先把數據庫文件復制到”/data/data/包名/databases/”目錄下面,然后通過db.openOrCreateDatabase(db文件),打開數據庫使用。我上一個項目就是這么做的,由于app上架之前就有一些初始數據需要內置,也會碰到數據的升級等問題,我是這么做的……同時我碰到最有意思的問題就是關于數據庫并發操作的問題,比如:多線程操作數據庫的時候,我采取的是封裝使用互斥鎖來解決……引入本地廣播的機制是為了解決安全性的問題:1)正在發送的廣播不會脫離應用程序,比用擔心app的數據泄露;2)其他的程序無法發送到我的應用程序內部,不擔心安全漏洞。(比如:如何做一個殺不死的服務監聽火的app比如微信、友盟、極光的廣播,來啟動自己。)3)發送本地廣播比發送全局的廣播高效。(全局廣播要維護的廣播集合表效率更低。全局廣播,意味著可以跨進程,就需要底層的支持。)本地廣播不能用靜態注冊。靜態注冊:可以做到程序停止后還能監聽。使用:如果有一個任務,可以分成很多個子任務,需要按照順序來完成,如果需要放到一個服務中完成,那么使用IntentService是最好的選擇。一般我們所使用的Service是運行在主線程當中的,所以在service里面編寫耗時的操作代碼,則會卡主線程會ANR。為了解決這樣的問題,谷歌引入了IntentService.IntentService的優點:(1)它創建一個獨立的工作線程來處理所有一個一個intent。(2)創建了一個工作隊列,來逐個發送intent給onHandleIntent()(3)不需要主動調用stopSelf()來結束服務,因為源碼里面自己實現了自動關閉。(4)默認實現了onBind()返回的null。(5)默認實現的onStartCommand()的目的是將intent插入到工作隊列。總結:使用IntentService的好處有哪些。首先,省去了手動開線程的麻煩;第二,不用手動停止service;第三,由于設計了工作隊列,可以啟動多次startService(),但是只有一個service實例和一個工作線程。一個一個熟悉怒執行。AIDL解決了什么問題?AIDL的全稱:AndroidInterfaceDefinitionLanguage,安卓接口定義語言。由于Android系統中的進程之間不能共享內存,所以需要提供一些機制在不同的進程之間進行數據通信。遠程過程調用:RPC—RemoteProcedureCall。安卓就是提供了一種IDL的解決方案來公開自己的服務接口。AIDL:可以理解為雙方的一個協議合同。雙方都要持有這份協議文本協議xxx.aidl文件(安卓內部編譯的時候會將aidl協議翻譯生成一個xxx.java文件代理模式:Binder驅動有關的,Linux底層通訊有關的。)在系統源碼里面有大量用到aidl,比如系統服務。電視機頂盒系統開發。你的服務要暴露給別的開發者來使用。講解Binder機制。Activity、Window、View三者如何協同顯示界面的。考點:顯示的過程(view繪制流程)源碼的熟悉度。Activity剪窗花的人(控制的);Window窗戶(承載的一個模型);View窗花(要顯示的視圖View);LayoutInflater剪刀將布局(圖紙)剪成窗花。(Alt+方向箭頭)fragment的特點?(你用fragment有沒有領略到一些樂趣,或者有沒有踩過什么坑?)fragment的設計主要是把Activity界面包括其邏輯打碎成很多個獨立的模塊,這樣便于模塊的重用和更靈活地組裝呈現多樣的界面。踩過的坑:幾種情況:

1)一般很多高版本的新的API都會在兼容包里面找到替代的實現。比如fragment。Notification,在v4兼容包里面有NotificationCompat類。5.0+出現的backgroundTint,minSdk小于5.0的話會包檢測錯誤,v4兼容包DrawableCompat類。2)沒有替代實現就自己手動實現。比如:控件的水波紋效果—第三方實現。或者直接在低版本去除這個效果。3)補充:如果設置了minSDK但是代碼里面使用了高版本的API,會出現檢測錯誤。需要在代碼里面使用聲明編譯檢測策略,比如:@SuppressLint和@TargetApi注解提示編譯器編譯的規則。@SuppressLint是忽略檢測;@TargetApi=23,會根據你函數里面使用的API,嚴格地匹配SDK版本,給出相應的編譯錯誤提示。4)為了避免位置的錯誤,最好不要使用廢棄api。(一般情況下不會有兼容性問題,后面可能會隨時刪除這個API方法;性能方面的問題。)

1)一般很多高版本的新的API都會在兼容包里面找到替代的實現。比如fragment。Notification,在v4兼容包里面有NotificationCompat類。5.0+出現的backgroundTint,minSdk小于5.0的話會包檢測錯誤,v4兼容包DrawableCompat類。2)沒有替代實現就自己手動實現。比如:控件的水波紋效果—第三方實現。或者直接在低版本去除這個效果。3)補充:如果設置了minSDK但是代碼里面使用了高版本的API,會出現檢測錯誤。需要在代碼里面使用聲明編譯檢測策略,比如:@SuppressLint和@TargetApi注解提示編譯器編譯的規則。@SuppressLint是忽略檢測;@TargetApi=23,會根據你函數里面使用的API,嚴格地匹配SDK版本,給出相應的編譯錯誤提示。4)為了避免位置的錯誤,最好不要使用廢棄api。(一般情況下不會有兼容性問題,后面可能會隨時刪除這個API方法;性能方面的問題。)棧:先進后出標準模式SingleTop:使用場景:瀏覽器的書簽;通訊消息聊天界面。SingleTask:使用場景:某個Activity當做主界面的時候。SingleInstance:使用場景:比如瀏覽器BrowserActivity很耗內存,很多app都會要調用它,這樣就可以把該Activity設置成單例模式。比如:鬧鐘鬧鈴。Measure:測量,測量自己。如果是ViewGroup就需要測量里面的所有childview.測量的結果怎么辦?setMeasuredDimension(resolveSizeAndState(maxWidth,widthMeasureSpec,childState),heightSizeAndState);設置自己的大小。Layout:擺放,把自己擺放在哪個位置。如果是ViewGroup就需要發放里面的所有childview.怎么去具體擺放呢?Draw:繪制/*

*Drawtraversalperformsseveraldrawingstepswhichmustbeexecuted

*intheappropriateorder:

*

*1.Drawthebackground

*2.Ifnecessary,savethecanvas'layerstoprepareforfading

*3.Drawview'scontent

*4.Drawchildren

*5.Ifnecessary,drawthefadingedgesandrestorelayers

*6.Drawdecorations(scrollbarsforinstance)

*/

1)什么是內存泄漏:最好解釋清楚GC垃圾回收機制以及概念GCRoot。2)為什么會有內存泄漏:因為內存泄漏是屬于人為的失誤造成的。而且面向對象開發關系復雜、多線程的關系,很容易出現引用層級關系很深以及很混亂。3)什么情況容易導致內存泄漏:4)如何解決內存泄漏

1)什么是內存泄漏:最好解釋清楚GC垃圾回收機制以及概念GCRoot。2)為什么會有內存泄漏:因為內存泄漏是屬于人為的失誤造成的。而且面向對象開發關系復雜、多線程的關系,很容易出現引用層級關系很深以及很混亂。3)什么情況容易導致內存泄漏:4)如何解決內存泄漏可以通過查看/data/anr/traces.txt查看ANR信息。根本原因是:主線程被卡了,導致應用在5秒時間未響應用戶的輸入事件。很多種ANR錯誤出現的場景:OOM產生的原因:內存不足,android系統為每一個應用程序都設置了一個硬性的條件:DalvikHeapSize最大閥值64M/48M/24M.如果你的應用程序內存占用接近這個閥值,此時如果再嘗試內存分配的時候就會造成OOM。如何避免內存泄露:1)減小對象的內存占用:2)內存對象的重復利用:使用對象池技術,兩種:

自己寫;利用系統既有的對象池機制。比如LRU(LastRecentlyUse)算法。

a.ListView/GridView源碼可以看到重用的情況ConvertView的復用。RecyclerView中Recycler源碼。

b.Bitmap的復用Listview等要顯示大量圖片。需要使用LRU緩存機制來復用圖片。

c.避免在onDraw方法里面執行對象的創建,要復用。避免內存抖動。

d常見的java基礎問題StringBuilder等

自己寫;利用系統既有的對象池機制。比如LRU(LastRecentlyUse)算法。3)避免對象的內存泄露4)使用一些內存的優化策略:看文檔1)通過Binder2)通過廣播把幾個關鍵版本的特性記住:3.0/4.0、4.4、5.0、6.0/7.0RequestLayout()方法:會導致調用Measure()方法和layout()。將會根據標志位判斷是否需要onDraw();onLayout():擺放viewGroup里面的子控件onDraw():繪制視圖本身;(ViewGroup還需要繪制里面的所有子控件)drawChild():重新回調每一個子視圖的draw方法。child.draw(canvas,this,drawingTime);invalidate():在主線程當中刷新;postInvalidate():在子線程當中刷新;其實最終調用的就是invalidate,原理依然是通過工作線程向主線程發送消息這一機制。publicvoidpostInvalidate(){

postInvalidateDelayed(0);

}

publicvoidpostInvalidateDelayed(longdelayMilliseconds){

//WetryonlywiththeAttachInfobecausethere'snopointininvalidating

//ifwearenotattachedtoourwindow

finalAttachInfoattachInfo=mAttachInfo;

if(attachInfo!=null){

attachInfo.mViewRootImpl.dispatchInvalidateDelayed(this,delayMilliseconds);

}

}

publicvoiddispatchInvalidateDelayed(Viewview,longdelayMilliseconds){

Messagemsg=mHandler.obtainMessage(MSG_INVALIDATE,view);

mHandler.sendMessageDelayed(msg,delayMilliseconds);

}

publicvoidhandleMessage(Messagemsg){

switch(msg.what){

caseMSG_INVALIDATE:

((View)msg.obj).invalidate();

break;傳統的動畫框架:View.startAnimation();弊端:移動后不能點擊。原因?跟實現機制有關系。所有的透明度、旋轉、平移、縮放動畫,都是在view不斷刷新調用draw的情況下實現的。調用的canvas.translate(

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論