1. 程式人生 > >Android 高階面試題及答案

Android 高階面試題及答案

一 效能優化

回到頂部

1.如何對 Android 應用進行效能分析

android 效能主要之響應速度 和UI重新整理速度。

首先從函式的耗時來說,有一個工具TraceView 這是androidsdk自帶的工作,用於測量函式耗時的。

UI佈局的分析,可以有2塊,一塊就是Hierarchy Viewer 可以看到View的佈局層次,以及每個View重新整理載入的時間。

這樣可以很快定位到那塊layout & View 耗時最長。

還有就是通過自定義View來減少view的層次。

回到頂部

2.什麼情況下會導致記憶體洩露

記憶體洩露是個折騰的問題。

什麼時候會發生記憶體洩露?記憶體洩露的根本原因:長生命週期的物件持有短生命週期的物件。短週期物件就無法及時釋放。

I. 靜態集合類引起記憶體洩露

主要是hashmap,Vector等,如果是靜態集合 這些集合沒有及時setnull的話,就會一直持有這些物件。

II.remove 方法無法刪除set集  Objects.hash(firstName, lastName);

經過測試,hashcode修改後,就沒有辦法remove了。

III. observer 我們在使用監聽器的時候,往往是addxxxlistener,但是當我們不需要的時候,忘記removexxxlistener,就容易記憶體leak。

廣播沒有unregisterrecevier

IV.各種資料鏈接沒有關閉,資料庫contentprovider,io,sokect等。cursor

V.內部類:

java中的內部類(匿名內部類),會持有宿主類的強引用this。

所以如果是new Thread這種,後臺執行緒的操作,當執行緒沒有執行結束時,activity不會被回收。

Context的引用,當TextView 等等都會持有上下文的引用。如果有static drawable,就會導致該記憶體無法釋放。

VI.單例

單例 是一個全域性的靜態物件,當持有某個複製的類A是,A無法被釋放,記憶體leak。

回到頂部

3.如何避免 OOM 異常

首先OOM是什麼?

當程式需要申請一段“大”記憶體,但是虛擬機器沒有辦法及時的給到,即使做了GC操作以後

這就會丟擲 OutOfMemoryException 也就是OOM

Android的OOM怎麼樣?

為了減少單個APP對整個系統的影響,android為每個app設定了一個記憶體上限。

複製程式碼
    public void getMemoryLimited(Activity context)
    {
        ActivityManager activityManager =(ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE);
        System.out.println(activityManager.getMemoryClass());
        System.out.println(activityManager.getLargeMemoryClass());
        System.out.println(Runtime.getRuntime().maxMemory()/(1024*1024));
    }
複製程式碼
09-10 10:20:00.477 4153-4153/com.joyfulmath.samples I/System.out: 192
09-10 10:20:00.477 4153-4153/com.joyfulmath.samples I/System.out: 512
09-10 10:20:00.477 4153-4153/com.joyfulmath.samples I/System.out: 192

HTC M7實測,192M上限。512M 一般情況下,192M就是上限,但是由於某些特殊情況,android允許使用一個更大的RAM。

如何避免OOM

減少記憶體物件的佔用

I.ArrayMap/SparseArray代替hashmap

II.避免在android裡面使用Enum

III.減少bitmap的記憶體佔用

  • inSampleSize:縮放比例,在把圖片載入記憶體之前,我們需要先計算出一個合適的縮放比例,避免不必要的大圖載入。
  • decode format:解碼格式,選擇ARGB_8888/RBG_565/ARGB_4444/ALPHA_8,存在很大差異。

IV.減少資源圖片的大小,過大的圖片可以考慮分段載入

記憶體物件的重複利用

大多數物件的複用,都是利用物件池的技術。

I.listview/gridview/recycleview contentview的複用

II.inBitmap 屬性對於記憶體物件的複用ARGB_8888/RBG_565/ARGB_4444/ALPHA_8

這個方法在某些條件下非常有用,比如要載入上千張圖片的時候。

III.避免在ondraw方法裡面 new物件

IV.StringBuilder 代替+

回到頂部

4.Android 中如何捕獲未捕獲的異常

複製程式碼
public class CrashHandler implements Thread.UncaughtExceptionHandler {

    private static CrashHandler instance = null;


    public static synchronized CrashHandler getInstance()
    {
        if(instance == null)
        {
            instance = new CrashHandler();
        }
        return instance;
    }

    public void init(Context context)
    {
        Thread.setDefaultUncaughtExceptionHandler(this);
    }

    @Override
    public void uncaughtException(Thread thread, Throwable ex) {
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("Thread:");
        stringBuilder.append(thread.toString());
        stringBuilder.append("\t");
        stringBuilder.append(ex);
        TraceLog.i(stringBuilder.toString());
        TraceLog.printCallStatck(ex);
    }
}
複製程式碼

關鍵是實現Thread.UncaughtExceptionHandler

然後是在application的oncreate裡面註冊。

回到頂部

5.ANR 是什麼?怎樣避免和解決 ANR(重要)

ANR->Application Not Responding

也就是在規定的時間內,沒有響應。

三種類型:

1). KeyDispatchTimeout(5 seconds) --主要型別按鍵或觸控事件在特定時間內無響應

2). BroadcastTimeout(10 seconds) --BroadcastReceiver在特定時間內無法處理完成

3). ServiceTimeout(20 seconds) --小概率型別 Service在特定的時間內無法處理完成

為什麼會超時:事件沒有機會處理 & 事件處理超時

怎麼避免ANR

ANR的關鍵

是處理超時,所以應該避免在UI執行緒,BroadcastReceiver 還有service主執行緒中,處理複雜的邏輯和計算

而交給work thread操作。

1)避免在activity裡面做耗時操作,oncreate & onresume

2)避免在onReceiver裡面做過多操作

3)避免在Intent Receiver裡啟動一個Activity,因為它會建立一個新的畫面,並從當前使用者正在執行的程式上搶奪焦點。

4)儘量使用handler來處理UI thread & workthread的互動。

如何解決ANR

首先定位ANR發生的log:

04-01 13:12:11.572 I/InputDispatcher( 220): Application is not responding:Window{2b263310com.android.email/com.android.email.activity.SplitScreenActivitypaused=false}.  5009.8ms since event, 5009.5ms since waitstarted
CPUusage from 4361ms to 699ms ago ----CPU在ANR發生前的使用情況
04-0113:12:15.872 E/ActivityManager(  220): 100%TOTAL: 4.8% user + 7.6% kernel + 87% iowait

04-0113:12:15.872 E/ActivityManager(  220): CPUusage from 3697ms to 4223ms later:-- ANR後CPU的使用量

從log可以看出,cpu在做大量的io操作。

所以可以檢視io操作的地方。

當然,也有可能cpu佔用不高,那就是 主執行緒被block住了。

回到頂部

6.Android 執行緒間通訊有哪幾種方式

1)共享變數(記憶體)

2)管道

3)handle機制

runOnUiThread(Runnable)

view.post(Runnable)

回到頂部

7.Devik 程序,linux 程序,執行緒的區別

Dalvik程序。

每一個android app都會獨立佔用一個dvm虛擬機器,執行在linux系統中。

所以dalvik程序和linux程序是可以理解為一個概念。

回到頂部

8.描述一下 android 的系統架構

從小到上就是:

linux kernel,lib dalvik vm ,application framework, app

回到頂部

9.android 應用對記憶體是如何限制的?我們應該如何合理使用記憶體?

activitymanager.getMemoryClass()  獲取記憶體限制。

關於合理使用記憶體,其實就是避免OOM & 記憶體洩露中已經說明。

回到頂部

10. 簡述 android 應用程式結構是哪些

1)main code

2) unit test

3)mianifest

4)res->drawable,drawable-xxhdpi,layout,value,mipmap

mipmap 是一種很早就有的技術了,翻譯過來就是紋理對映技術.

google建議只把啟動圖片放入。

5)lib

6)color

回到頂部

11.請解釋下 Android 程式執行時許可權與檔案系統許可權的區別

檔案的系統許可權是由linux系統規定的,只讀,讀寫等。

執行時許可權,是對於某個系統上的app的訪問許可權,允許,拒絕,詢問。該功能可以防止非法的程式訪問敏感的資訊。

回到頂部

12.Framework 工作方式及原理,Activity 是如何生成一個 view 的,機制是什麼

Framework是android 系統對 linux kernel,lib庫等封裝,提供WMS,AMS,bind機制,handler-message機制等方式,供app使用。

簡單來說framework就是提供app生存的環境。

1)Activity在attch方法的時候,會建立一個phonewindow(window的子類)

2)onCreate中的setContentView方法,會建立DecorView

3)DecorView 的addview方法,會把layout中的佈局載入進來。

回到頂部

13.多執行緒間通訊和多程序之間通訊有什麼不同,分別怎麼實現

執行緒間的通訊可以參考第6點。

程序間的通訊:bind機制(IPC->AIDL),linux級共享記憶體,boradcast,

Activity  之間,activity & serview之間的通訊,無論他們是否在一個程序內。

回到頂部

14.Android 螢幕適配

螢幕適配的方式:xxxdpi, wrap_content,match_parent. 獲取螢幕大小,做處理。

dp來適配螢幕,sp來確定字型大小

drawable-xxdpi, values-1280*1920等 這些就是資源的適配。

wrap_content,match_parent, 這些是view的自適應

weight,這是權重的適配。

回到頂部

15.什麼是 AIDL 以及如何使用

Android Interface Definition Language

AIDL是使用bind機制來工作。

引數:

java原生引數

String 

parcelable

list & map 元素 需要支援AIDL

回到頂部

16.Handler 機制

回到頂部

17.事件分發機制

回到頂部

18.子執行緒發訊息到主執行緒進行更新 UI,除了 handler 和 AsyncTask,還有什麼

EventBus,廣播,view.post, runinUiThread

但是無論各種花樣,本質上就2種:handler機制 + 廣播

回到頂部

19.子執行緒中能不能 new handler?為什麼

必須可以。子執行緒 可以new 一個mainHandler,然後傳送訊息到UI Thread。

回到頂部

20.Android 中的動畫有哪幾類,它們的特點和區別是什麼

檢視動畫,或者說補間動畫。只是視覺上的一個效果,實際view屬性沒有變化,效能好,但是支援方式少。

屬性動畫,通過變化屬性來達到動畫的效果,效能略差,支援點選等事件。android 3.0

幀動畫,通過drawable一幀幀畫出來。

Gif動畫,原理同上,canvas畫出來。

具體可參考:https://i.cnblogs.com/posts?categoryid=672052

回到頂部

21.如何修改 Activity 進入和退出動畫

 overridePendingTransition

回到頂部

22.SurfaceView & View 的區別

view的更新必須在UI thread中進行

surfaceview會單獨有一個執行緒做ui的更新。

surfaceview 支援open GL繪製。

二專案框架的使用

回到頂部

23.開發中都使用過哪些框架、平臺

I.EventBus 事件分發機制,由handler實現,執行緒間通訊

II.xUtils->DbUtils,ViewUtils,HttpUtils,BitmapUtils

III.百度地圖

IV.volley

V.fastjson

VI.picciso

VII.友盟

VIII.zxing

IX.Gson

回到頂部

24.使用過那些自定義View

pull2RefreshListView

回到頂部

25.自定義控制元件:繪製圓環的實現過程

 1 public class CrashHandler implements Thread.UncaughtExceptionHandler {
 2 
 3     private static CrashHandler instance = null;
 4 
 5 
 6     public static synchronized CrashHandler getInstance()
 7     {
 8         if(instance == null)
 9         {
10             instance = new CrashHandler();
11         }
12         return instance;
13     }
14 
15     public void init(Context context)
16     {
17         Thread.setDefaultUncaughtExceptionHandler(this);
18     }
19 
20     @Override
21     public void uncaughtException(Thread thread, Throwable ex) {
22         StringBuilder stringBuilder = new StringBuilder();
23         stringBuilder.append("Thread:");
24         stringBuilder.append(thread.toString());
25         stringBuilder.append("\t");
26         stringBuilder.append(ex);
27         TraceLog.i(stringBuilder.toString());
28         TraceLog.printCallStatck(ex);
29     }
30 }
31 
32 CrashHandler

關鍵是canvas.drawCycle & paint.setsytle(stoken)

回到頂部

26.自定義控制元件:摩天輪的實現過程

回到頂部

27.GridLayout的使用

可以不需要adapter

回到頂部

28.流式佈局的實現過程

TBD.

回到頂部

29.第三方登陸

QQ & 微信都有第三方登陸的sdk,要去註冊app

回到頂部

30.第三方支付

需要看支付寶的API文件

相關推薦

Android 高階試題答案

一 效能優化 回到頂部 1.如何對 Android 應用進行效能分析 android 效能主要之響應速度 和UI重新整理速度。 首先從函式的耗時來說,有一個工具TraceView 這是androidsdk自帶的工作,用於測量函式耗時的。 UI佈局的分析,可以有2塊,一塊就是Hierarchy Viewer

分享:《Java高階試題答案》!

前言不管是開發、測試、運維,每個技術人員心裡多多少少都有一個成為技術大牛的夢,畢竟“夢想總是要有的,萬一實現了呢”!正是對技術夢的追求,促使我們不斷地努力和提升自己。List和Set比較,各自的子類比較對比一:Arraylist與LinkedList的比較1、ArrayLis

Android 高級試題答案

進行 nag 虛擬 系統架構 httputil 權重 inter 限制 管道 閱讀目錄 1.如何對 Android 應用進行性能分析 2.什麽情況下會導致內存泄露 3.如何避免 OOM 異常 4.Android 中如何捕獲未捕獲的異常 5.ANR 是什麽?

常見Android試題答案(詳細整理)

以下是一些常用的Android面試題及答案,有需要沒需要都可以備著,希望能幫到大家。 1. 請描述一下Activity 生命週期。 答: 如下圖所示。共有七個周期函式,按順序分別是: onCreate(), onStart(), onRestart(), onResu

盤點2019年PHP高階開發工程師試題答案彙總

今天小編給大家整理一下關於PHP培訓高階面試題及答案彙總,下面我們一起來看一下吧。

PHP試題答案解析(8)—PHP綜合應用題

java應用程序 外殼 sleep 服務應用程序 解釋 源碼 use lee eve 1.寫出下列服務的用途和默認端口。 ftp、ssh、http、telnet、https ftp:File Transfer Protocol,文件傳輸協議,是應用層的協議,它基於傳輸層,

100+經典Java試題答案解析

是什麽 自定義 我們 計數 接口類 同步方法 main err ans 面向對象編程(OOP) Java是一個支持並發、基於類和面向對象的計算機編程語言。下面列出了面向對象軟件開發的優點: 代碼開發模塊化,更易維護和修改。 代碼復用。 增強代碼的可靠性和靈活

JavaScript基本的試題答案

對象 con cnblogs typeof fin 如果 defined 輸出結果 是什麽 1、使用typeof bar==="object"來確定bar是否是對象的潛在陷阱是什麽?如何避免這個陷阱? 例: var bar=null; console.log(typeof

史上最全Java多線程試題答案

blog 上下文 exec 線程 單例 通信 流轉 排查 創建 多線程有什麽用? 線程和進程的區別是什麽? Java實現線程有哪幾種方式? 啟動線程方法start()和run()有什麽區別? 怎麽終止一個線程?如何優雅地終止線程? 一個線程的生命周期

Linux必問試題,雲計算試題答案

雲計算×××教育總結了很多雲計算面試題及答案,一起來看一下吧! 1.生產場景如何對linux系統進行合理規劃分區? 分區的根本原則是簡單、易用、方便批量管理。根據服務器角色定位建議如下: ①單機服務器:如8G內存,300G硬盤 分區: /boot 100-200M,swap 16G,內存大小8G*2,/ 80

經典的一套SQL試題答案

SQL SqlServer 數據庫 面試經典的一套SQL面試題及答案

15個頂級Java多線程試題答案

ctrl 打印 MF 進程 lock 異常 mage 分析 iar 在任何Java面試當中多線程和並發方面的問題都是必不可少的一部分。如果你想獲得任何股票投資銀行的前臺資訊職位,那麽你應該準備很多關於多線程的問題。在投資銀行業務中多線程和並發是一個非常受歡迎的話題,特別是電

軟件測試試題答案【匯總】

代碼復用 尋找 質量保證 形式 協議 優先級 應對 考慮問題 調查 軟件測試面試題及答案,歡迎參考!   1、你的測試職業發展是什麽?   測試經驗越多,測試能力越高。所以我的職業發展是需要時間積累的,一步步向著高級測試工程師奔去。而且我也有初步的職業規劃,前3年積累測

關於H5的20道試題答案

查找 除了 模式 鏈接 canvas ike 空元素 search 人的 1 DOCTYPE有什麽作用?標準模式與混雜模式如何區分?它們有何意義? 告訴瀏覽器使用哪個版本的HTML規範來渲染文檔。DOCTYPE不存在或形式不正確會導致HTML文檔以混雜模式呈現。 標準模式

C# 試題答案31-60

ron 保護 靜態方法 方法 重載 可空類型 ast RoCE lis 2018/8/4 c# 面試系列續 31) “System.Array.Clone()” 和 “System.Array.CopyTo()” 有何不同?   1、“CopyTo()” 從一個數組復制

C#經典試題答案

list add 字段 有一個 副本 udp 隔離性 垃圾回收 readonly 字節 1.請你說說.net 中類和結構的區別? 答:結構和類具有大體的語法,但是結構受到的限制比類多。結構不能聲明默認的的構造函數,為結構的副本是編譯器創建和銷毀的,所以不需要默認的構造函數和

Java 多執行緒試題答案(非常全面)

這篇文章主要是對多執行緒的問題進行總結的,因此羅列了40個多執行緒的問題。 這些多執行緒的問題,有些來源於各大網站、有些來源於自己的思考。可能有些問題網上有、可能有些問題對應的答案也有、也可能有些各位網友也都看過,但是本文寫作的重心就是所有的問題都會按照自己的理解回答一遍,不會去看網上的

華為的JAVA試題答案(部分)

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

iOS試題答案

1,設計模式是什麼?你知道哪些設計模式,並簡要敘述? 設計模式是一種編碼經驗,就是用比較成熟的邏輯去處理某一種型別的事情。 1). MVC模式:Model View Control,把模型 檢視 控制器 層進行解耦合編寫。 2). MVVM模式:Model View ViewModel 把模型

試題答案

1. 為什麼學習Python? 自身覺得有個一技之長在手,心裡踏實,現在瞭解到人工智慧是以後的發展趨勢,然後經過網上查詢資料,以及自己朋友的推薦,說python在人工智慧方面涉及到很多領域,且程式碼簡潔,簡單易學,生態圈強大,因此來學python。 3. Python和Java、PHP、C、C#、C++等其他