1.解釋下在單線程模型中Message,Handler,Message Queue,Looper之間的關係。java
主線程中,主線程啓動時會調用Looper.prepare()方法,會初始化一個Looper,放入Threadlocal中,接着調用Looper.loop()遍歷Message Queue; Handler的建立依賴與當前線程中的Looper,若是當前線程沒有Looper則必須調用Looper.prepare()。Handler,sendMessage到MessageQueue,Looper不斷從MessageQueue中取出消息,回調handleMeaage方法。算法
2.內存溢出和內存泄漏的區別?什麼時候會產生內存泄漏?內存優化有哪些方法?數組
內存溢出:應用程序運行時須要的內存,超出了它可用的最大內存緩存
內存泄漏:針對某一內存空間的使用,使用完成後沒有釋放。安全
內存優化:Android中容易內存溢出的部分,就是圖片的加載,咱們可使用圖片的壓縮加上使用LruCache緩存的方法來控制圖片所可以使用的內存app
除此以外,對於比較耗資源的對象及時的關閉,好比service、conn、各種傳感器、Database,屏幕旋轉,整個Activity對象會有泄漏。函數
解決辦法(避免內存泄漏沒有簡單的解決方案,但Android提供的工具和API能夠提供幫助):DDMS視圖中,可使用Heap及Alloction Tracker跟蹤內存使用和分配狀況。 Android2.3定義StrictMode類,對檢測潛在的內存泄漏有很大幫助,但在3.0以上版本中,能夠檢測的潛在內存泄漏的狀況有:工具
1.activity泄漏oop
2.其餘對象泄漏佈局
3.對象沒有關閉形成的泄漏
3.AsyncTask使用在哪些場景?它的缺陷是什麼?如何解決?
AsyncTask運用的場景是須要進行一些耗時的操做,耗時操做完成時更新主線程,或者在操做過程當中對主線程的UI進行更新
缺陷:AsyncTask中維護着一個長度爲128的線程池,同時能夠執行5個工做線程,還有一個緩衝隊列,當線程池中已有128個線程,緩衝隊列已滿,若是此時向線程提交任務,將會拋出RejectedExecutionException
處理:由一個線程來處理AsyncTask的調用判斷線程池是否滿了,若是滿了線程睡眠不然請求AsyncTask繼續處理。
4.context的做用是什麼?一個APP最多會建立多少個Context對象?
①context是一個抽象類,其通用實如今ContextImpl類中。
②Context是一個訪問application環境全局信息的接口,經過它能夠訪問application的資源和相關類,其主要功能以下:
啓動Activity 啓動和中止Service 發生廣播消息(Intent) 註冊廣播消息接收者
能夠訪問APK中各類資源(Resources 和 AssetManager等)
能夠訪問Package的相關信息 APK的各類權限管理
從以上能夠看出,Context就是一個對APK包無所不知的大管家,想知道什麼信息,就去訪問它就能夠了
Context與View的關係
ContextWrapper
它只是對Context類的一種封裝,它的構造函數包含了一個真正的Context引用,即ContextImpl對象
ContextThemeWrapper
該類包含了主題(Theme)相關接口,即安卓theme指定的,由於service不須要theme,因此Service直接繼承ContextWrapper
什麼時候建立Context
①建立Application對象時
②建立service對象時
③建立Activity對象時
所以應用程序App共有的Context數目公式爲:
總Context實例個數 = NUM(Activity) + NUM(Service) + 1(Application)
5.寫出並描述Service和Activity的交互方式
6.Android開發過程當中如何進行算法與界面的優化?
挑戰程序的進程結構,減小進程數量,減小進程週期循環次數,即時讓線程休眠,不編寫長壽代碼,只在須要時運行,服務應快速完成並當即結束。
調整算法,取消沒必要要的環節,減小對CPU和內存的需求,減小函數的調用次數,適當使用JNI
精心設計界面避免複雜佈局,控制嵌套和View數量,善用Merge、inflate()、RelativeLayout等去除沒必要要的背景、動畫執行長時間、好點的任務前檢查電量,提示用戶
7.
================================================java====================================================
1.計算下列result的值
int a = 1234567;
int b = 0x06;
int result = a&b; 6
二進制&運算,很簡單,轉化成二進制進行與運算,必定不要犯懶,我就是犯懶沒有計算a的二進制,結果本身就悲劇了。。。
2.抽象類與接口的區別?
abstract能夠修飾抽象方法,而一個類主要有一個抽象方法,就必須用abstract定義該類,即抽象類。
用interface修飾的類,裏面的方法都是抽象方法,所以在定義接口的時候,能夠直接不加那些修飾,系統會默認加上去,接口裏面的字段都是共有常量,即public static final
3.集合實現類與區別?
Collection接口、集合結構總的父接口,有兩個子接口list和set
list有序,元素可重複 實現類:ArrayList數組實現輕量級、運行快、線程不安全、查詢快
Vectot數組實現重量級,運行慢、線程安全
LinkedList 鏈表實現,經常使用於堆棧與隊列的實現 增刪操做快
set接口 元素無序不重複
實現類:HashSet,底層用hashCode算法實現,保證元素的無序惟一,自定義對象存進HashSet爲了保證元素內容不重複,須要重寫hashCode()和equals()方法。
SortedSet元素有序 惟一
TreeSet要求元素有序,自定義的對象須要實現Comparable接口的compareTo(Object o)方法
Map:與Collection接口無關,有一個子接口SortedMap 無序,key-value對,key惟一,value可重複
HashMap輕量級 線程不安全,容許key或value爲null
HashTable 重量級 線程安全 不容許key或vaule爲null
Properties是HashTable的子類,主鍵和值都是字符串
4.線程的狀態有幾種?分別是什麼?
1)新建狀態:建立了一個線程對象。
2)就緒狀態:線程對象建立後,其餘線程調用了該對象的start方法。該狀態的線程位於可運行線程池中,變得可運行,等待CPU的使用權
3)運行狀態:就緒狀態的線程得到了CPU,執行run()方法
4)阻塞狀態:阻塞狀態是由於線程由於某種緣由放棄CPU使用權,暫時中止運行。直到線程進入就緒狀態,線程纔有機會繼續運行。阻塞狀況分爲3中