經典Android面試題

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中

相關文章
相關標籤/搜索