天天看點

android 常見面試題(二)

介紹:

上一篇部落格分享了一些面試題,今天接着分享一些常見的android面試題

1)什麼是ANR 如何避免它?(Android線程間的通信方式 )

答:ANR:Application Not Responding(應用程式無響應).當出現下列情況時,Android就會顯示ANR對話框了: 對輸入事件(如按鍵、觸摸屏事件)的響應超過5秒 意向接受器(intentReceiver)超過10秒鐘仍未執行完畢Android應用程式完全運作在一個獨立的線程中(例如main)。這就意味着,任何在主線程中運作的,需要消耗大量時間的操作都會引發ANR。

解決方案有兩種:

1)AsyncTask異步任務中,doInBackground()和onPostExecute(Result)兩個方法非常重要

doInBackground() 這個方法運作在背景線程中,主要負責執行那些很耗時的操作,如移動護理系統中的網絡連接配接、解析XML等操作。該方法必須重載。

onPostExecute(Result) 這個方法也運作于UI線程,在doInBackground(Params…)方法執行後調用,該方法用于處理背景任務執行後傳回的結果。

2) 子thread + handler

2)listview優化政策

答:1)對convetView進行判空,是當convertView不為空的時候直接重新使用convertView

進而減少了很多不必要的View的建立

2)定義一個ViewHolder,将convetView的tag設定為ViewHolder,不為空時重新使用即可

3)當ListView加載資料量較大時可以采用分頁加載和圖檔異步加載

3)ListView分頁加載實作思路

實作OnScrollListener 接口重寫onScrollStateChanged 和onScroll方法,使用onscroll方法實作”滑動“後處理檢查是否還有新的記錄,如果有,調用 addFooterView,添加記錄到adapter, adapter調用 notifyDataSetChanged 更新資料;如果沒有記錄了,把自定義的mFooterView去掉。使用onScrollStateChanged可以檢測是否滾到最後一行且停止滾動然後執行加載

4)ListView圖檔異步加載實作思路

1)先從記憶體緩存中擷取圖檔顯示(記憶體緩沖)

2)擷取不到的話從SD卡裡擷取(SD卡緩沖,從SD卡擷取圖檔是放在子線程裡執行的,否則快速滑屏的話會不夠流暢)

3)都擷取不到的話從網絡下載下傳圖檔并儲存到SD卡同時加入記憶體并顯示(視情況看是否要顯示)

5)Intent的原理、作用、可以傳遞哪些類型的參數

intent是連接配接Activity, Service, BroadcastReceiver, ContentProvider四大元件的信使,,可以傳遞八種基本資料類型以及string, Bundle類型,以及實作了Serializable或者Parcelable的類型。

Intent可以劃分成顯式意圖和隐式意圖。

顯式意圖:調用Intent.setComponent()或Intent.setClass()方法明确指定了元件名的Intent為顯式意圖,顯式意圖明确指定了Intent應該傳遞給哪個元件。

隐式意圖:沒有明确指定元件名的Intent為隐式意圖。 Android系統會根據隐式意圖中設定的動作(action)、類别(category)、資料(URI和資料類型)找到最合适的元件來處理這個意圖。

6)如何實作螢幕分辨率的自适應(布局、九線圖、目錄)

答: 最好可以通過權重(layout_weight)的方式來配置設定每個元件的大小,也可以通過具體的像素(dip)來确定大小。

盡量使用Relativelayout 。

已知應用支援平台裝置的分辨率,可以提供多個layout_320*480 ...

drawable-hdpi,drawable-mdpi,drawable-ldpi分别代表分辨率為480*800,360*480,240*360, 放置圖檔大小相差1.5倍

最後還需要在AndroidManifest.xml裡添加下面一段,沒有這一段自适應就不能實作:

<supports-screens

android:largeScreens="true"

android:normalScreens="true"

 android:anyDensity = "true"/>

在</application>标簽和</manifest> 标簽之間添加上面那段代碼。即可。

備注:三者的解析度不一樣,就像你把電腦的分辨率調低,圖檔會變大一樣,反之分辨率高,圖檔縮小

還可以通過.9.png實作圖檔的自适應

7)簡述Android中的IPC機制

IPC(Inter-Process Communication,程序間通信),aidl是 Android Interface definition language的縮寫,它是一種android内部程序通信接口的描述語言,通過它我們可以定義程序間的通信接口.編譯器可以通過擴充名為aidl的檔案生成一段代碼,通過預先定義的接口達到兩個程序内部通信程序的目的.

BroadcastReceiver也可以實作程序間通信

ContentProvider 提供程序間資料共享

8)android哪幾種方式通路網絡

http協定:超文本傳輸協定

(最底層的是Socket,接着是URLConnection,HttpClient)

HttpURLConnection

HttpClient方式(HttpGet和HttpPost類)

9)說說HttpClient的通信過程

1)生成請求對象(HttpGet get,HttpPost post)

2)生成用戶端對象 HttpClient client

3)執行請求接收相應 HttpResponse response = client.execute(post)

HttpEntity entity = response.getEntity()

4)得到資料流

InputStream inputStream = entity.getContent();

5)最後關閉過期連接配接

10)XML解析有哪幾種?各自優缺點,官方推薦使用哪種

基本的解析方式有三種: DOM,SAX,Pull

1)dom解析解析器讀入整個文檔,然後建構一個駐留記憶體的樹結構,然後代碼就可以使用 DOM 接口來操作這個樹結構的優點是對文檔增删改查比較友善,缺點占用記憶體比較大。

2)sax解析基于事件驅動型,優點占用記憶體少,解析速度快,缺點是隻适合做文檔的讀取,不适合做文檔的增删改查。

3)pull解析同樣基于事件驅動型,android 官方API提供,可随時終止,調用next() 方法提取它們(主動提取事件)

11)百度地圖核心類,及實作的功能

BMapManager:地圖引擎管理類,負責初始化,開啟地圖API,終止百度地圖API等工作

MKSearch:搜尋服務.用于位置檢索、周邊檢索、範圍檢索、公交檢索、駕乘檢索、步行檢索

MKSearchListener搜尋結果通知接口。該接口傳回poi搜尋,公交搜尋,駕乘路線,步行路線結果

MapView:顯示地圖的View

MyLocationOverlay:一個負責顯示使用者目前位置的Overlay。

Overlay:Overlay是一個基類,它表示可以顯示在地圖上方的覆寫物。

12)GC記憶體洩露在什麼情況下會出現?怎麼解決

  1. 查詢資料庫沒有關閉遊标
  2. 構造Adapter時,沒有使用緩存的 convertView
  3. Bitmap對象不在使用時調用recycle()釋放記憶體
  4. 不用的對象沒有及時釋放對象的引用

13)android記憶體的優化

答:android記憶體洩露容易導緻記憶體溢出,又稱為OOM。

Android記憶體優化政策:

1)在循環内盡量不要使用局部變量

2)不用的對象即時釋放,即指向NULL

3)資料庫的cursor即時關閉。

4)構造adapter時使用緩存contentview

5)調用registerReceiver()後在對應的生命周期方法中調用unregisterReceiver()

6)即時關閉InputStream/OutputStream。

7)android系統給圖檔配置設定的記憶體隻有8M, 圖檔盡量使用軟引用, 較大圖檔可通過BitmapFactory縮放後再使用,并及時recycle

8)盡量避免static成員變量引用資源耗費過多的執行個體。

14)加載大圖檔的時候如何防止記憶體溢出

答: android系統給圖檔配置設定的記憶體隻有8M,當加載大量圖檔時往往會出現OOM。

Android加載大量圖檔記憶體溢出解決方案:

1)盡量不要使用setImageBitmap或setImageResource或BitmapFactory.decodeResource來設定一張大圖,因為這些函數在完成decode後,最終都是通過java層的createBitmap來完成的,需要消耗更多記憶體,可以通過BitmapFactory.decodeStream方法,建立出一個bitmap,再将其設為ImageView的 source

2)使用BitmapFactory.Options對圖檔進行壓縮

 InputStream is = this.getResources().openRawResource(R.drawable.pic1);

 BitmapFactory.Options options=new BitmapFactory.Options();

 options.inJustDecodeBounds = false;

 options.inSampleSize = 10; //width,hight設為原來的十分一

 Bitmap btp =BitmapFactory.decodeStream(is,null,options);

3)運用Java軟引用,進行圖檔緩存,将需要經常加載的圖檔放進緩存裡,避免反複加載

及時銷毀不再使用的Bitmap對象

 if(!bmp.isRecycle() ){

 bmp.recycle() //回收圖檔所占的記憶體

 system.gc() //提醒系統及時回收

 }

15)Android緩存機制

答: 用戶端緩存機制是android應用開發中非常重要的一項工作,使用緩存機制不僅僅可以為使用者節省3G流量,同時在使用者體驗方面也是非常好的選擇,比如有些新聞用戶端支援離線模式,也是通過緩存機制實作的.緩存機制分為兩部分,一部分是文字緩存,另一部分是多媒體檔案緩存.

文字緩存有兩種實作:

1)可以将與伺服器互動得到的json資料或者xml資料存入sd卡中,并在資料庫添加該資料的記錄.添加資料庫記錄時,提供兩個關鍵字段,一個是請求的URL,另一個則是本地儲存後的檔案位址,每次加載資料之前都會根據URL在資料庫中檢索

2)将JSON資料解析後裝入List<Map>對象中,然後周遊List,将資料統統寫入相應的資料庫表結構中,以後每次向伺服器發起請求之前可以先在資料庫中檢索,如果有直接傳回.

多媒體檔案緩存:主要指圖檔緩存

圖檔的緩存可以根據目前日期,時間為名字緩存到SD卡中的指定圖檔緩存目錄,同時資料庫中做相應記錄,記錄辦法可以采用兩個關鍵字段控制,一個字段是該圖檔的URL位址,另一個字段是該圖檔的本機位址.取圖檔時根據URL在資料中檢索,如果沒有則連接配接伺服器下載下傳,下載下傳之後再伺服器中作出相應記錄

緩存檔案删除政策:

1) 每一個子產品在每次用戶端自動或者使用者手動更新的時候删除相應子產品的緩存檔案,并重新下載下傳新的緩存檔案.

2)在設定界面中提供删除緩存的功能,點選後删除本機所有緩存.

16)MVC在Android中的應用

答: Android中界面部分也采用了目前比較流行的MVC架構,在Android中:

1) 視圖層(View):一般采用XML檔案進行界面的描述,使用的時候可以非常友善的引入。也可以使用JavaScript+HTML等的方式作為View層,通過WebView元件加載,同時可以實作Java和JavaScript之間的通信。

2) 控制層(Controller):這句話也就暗含了不要在Acitivity中寫代碼,要通過Activity交割Model業務邏輯層處理,這樣做的另外一個原因是Android中的Acitivity的響應時間是5s,如果耗時的操作放在這裡,Android的控制層的重任通常落在了衆多的Acitvity的肩上,程式就很容易被回收掉。

3) 模型層(Model):對資料庫的操作、對網絡等的操作都應該在Model裡面處理,當然對業務計算等操作也是必須放在的該層的。

 在Android SDK中的資料綁定,也都是采用了與MVC架構類似的方法來顯示資料。在控制層上将資料按照視圖模型的要求(也就是Android SDK中的Adapter)封裝就可以直接在視圖模型上顯示了,進而實作了資料綁定。比如顯示Cursor中所有資料的ListActivity,其視圖層就是一個ListView,将資料封裝為ListAdapter,并傳遞給ListView,資料就在ListView中顯示。

17)Android自定義元件實作思路

答: Android自定義元件有三種實作思路:

  1. 繼承某個現有元件,在其基礎上添加額外功能,如繼承Gallery實作CoverFlow效果
  2. 繼承某個Layout,實作複合元件自定義,如TextView和EditText組合實作登入注冊元件
  3. 繼承View,實作onDraw()方法,實作自己繪制元件,如翻頁效果元件

18)版本更新的實作思路

答:在伺服器相應URL上有版本檔案, 用戶端同時存儲該應用目前版本号 (SharedPreferences/Sqlite), 每次打開應用,去檢測伺服器版本号與本地版本号是否一緻,如果不一 緻,則自定義對話框提示是否下載下傳更新

19)NDK開發流程?(JNI運作原理)

答: NDK應用的開發流程(在應用中定義本地接口(native), 編譯成.h頭檔案,交由C程式員實作,将.c實作通過NDK編譯成.so動态連結庫,導入項目中libs/armeabi,代碼中調用該本地接口)

應用場景: 音頻,視訊解碼,拍攝車牌号,識别車牌号

20)談談UI中, Padding和Margin有什麼差別,gravity與layout_gravity的差別

答:Padding 用來指定元件内的内容距離元件邊界的距離;

 Margin用來指定控件與控件之間的距離

Gravity用來指定元件内的内容相對于元件本身的位置

Layout_gravity用來指定元件相對于其父元件的位置

繼續閱讀