Android開發面試經——6.常見面試官提問Android題②(更新中...)

 

關注finddreams博客:http://blog.csdn.net/finddreams/article/details/44560061 
1.HttpURLConnection和HttpClient他們各自的優缺點是什麼? 
HttpUrlConnection 在 2.3 之前的版本是有 bug 的,因此以前的版本推薦使用 HttpClient,可是 google 如今已經不維護 HttpClient 了,5.1裏面已經把 HttpClient 標過時。另外 HttpURLConnection 支持gzip壓縮等,推薦首選它。 
在 Froyo(2.2) 以前,HttpURLConnection 有個重大 Bug,調用 close() 函數會影響鏈接池,致使鏈接複用失效,因此在 Froyo 以前使用 HttpURLConnection 須要關閉 keepAlive。 
另外在 Gingerbread(2.3) HttpURLConnection 默認開啓了 gzip 壓縮,提升了 HTTPS 的性能,Ice Cream Sandwich(4.0) HttpURLConnection 支持了請求結果緩存。 
再加上 HttpURLConnection 自己 API 相對簡單,因此對 Android 來講,在 2.3 以後建議使用 HttpURLConnection,以前建議使用 AndroidHttpClient。android

2.Android開發中XML解析方式的比較 ,及優缺點? 
DOM,SAX,Pull解析。 
SAX解析器的優勢是解析速度快,佔用內存少;面試

DOM在內存中以樹形結構存放,所以檢索和更新效率會更高。可是對於特別大的文檔,解析和加載整個文檔將會很耗資源,不適合移動端;設計模式

PULL解析器的運行方式和SAX相似,都是基於事件的模式,PULL解析器小巧輕便,解析速度快,簡單易用,很是適合在Android移動設備中使用,Android系統內部在解析各類XML時也是用PULL解析器。緩存

3.請問平時開發過程當中,你是如何作到多分辨率適配的? 
1.根據不一樣分辨率創建不一樣的佈局文件 
2.根據分辨率不一樣創建不一樣分辨率的資源圖片 
3.在程序啓動時,獲取當前屏幕的分辨率和密度,在代碼中進行適配 
4.爲不一樣分辨率的寫不一樣的dimen文件。 
5.其實還有就是多使用fragement微信

4. 談談你在工做中是怎樣解決一個bug的? 
1.看Log日誌 
2.Log解決不了就斷點調試 
3.若是debug不行 
4.就在異常代碼的附近Log.e(「error」,」1」);,2,3,4,5,6,7,8,9 每隔一行一個Log輸出,看結果 
5.找到問題,自行找思路。若是是技術瓶頸,就google之markdown

5.聲明ViewHolder內部類時,爲何建議使用static關鍵字? 
其實這個是考靜態內部類和非靜態內部類的主要區別之一。非靜態內部類會隱式持有外部類的引用,就像你們常常將自定義的adapter在Activity類裏,而後在adapter類裏面是能夠隨意調用外部activity的方法的。當你將內部類定義爲static時,你就調用不了外部類的實例方法了,由於這時候靜態內部類是不持有外部類的引用的。聲明ViewHolder靜態內部類,能夠將ViewHolder和外部類解引用。你們會說通常ViewHolder都很簡單,不定義爲static也沒事吧。確實如此,可是若是你將它定義爲static的,說明你懂這些含義。萬一有一天你在這個ViewHolder加入一些複雜邏輯,作了一些耗時工做,那麼若是ViewHolder是非靜態內部類的話,就很容易出現內存泄露。若是是靜態的話,你就不能直接引用外部類,迫使你關注如何避免相互引用。 因此將 ViewHolder內部類 定義爲靜態的,是一種好習慣. 
非靜態內部類隱式持有外部類的強引用,只是可能會致使內存泄露,而通常狀況下在使用viewhodler是不會致使內存泄露的,加static是一個比較好的習慣網絡

6.如何在不失真的條件下顯示一張超高清的圖片或者長圖? 
一、經過計算BitmapFactory.Options 對象的inSamleSize 值 等比的壓縮圖片 。 
二、使用WebView來加載該圖片; 
三、使用MapView或者TileView來顯示圖片(相似地圖的機制);微信開發

7. Android中有哪些方法實現定時和延時任務?它們的適用場景是什麼? 
倒計時類 
用CountDownTimer框架

延遲類 
CountDownTimer,可巧妙的將countDownInterval設成和millisInFuture同樣,這樣就只會調用一次onTick和一次onFinish 
handler.sendMessageDelayed,可參考CountDownTimer的內部實現,簡化一下,我的比較推薦這個 
TimerTask,代碼寫起來比較亂 
Thread.sleep,感受這種不太好 
使用Handler方法postDelay(runnable, delayTime)

定時類 
參照延遲類的,本身計算好要延遲多少時間 
handler.sendMessageAtTime 
AlarmManager,適用於定時比較長遠的時間,例如鬧鈴

8.談談你對StrongReference、WeakReference和SoftReference的認識 
強引用(StrongReference):就是在代碼中廣泛存在的,相似Object obj = new Object()這類的引用,只要強引用還存在,GC永遠不會回收掉被引用的對象。 
軟引用(SoftReference):用來描述一些還有用但非必須的對象。對於軟引用關聯着的對象,在系統將要發生內存溢出異常時,將會把這些對象列入回收範圍之中進行第二次回收。若是此次回收尚未足夠的內存,纔會拋出內存溢出異常。在JDK 1.2以後,提供了SoftReference類來實習軟引用。

弱引用(WeakReference):也是用來描述非必須對象的,可是它的強度比軟引用更弱一些,被弱引用關聯的對象只能生存到了下一次GC發生以前。當GC工做時,不管當時內存是否足夠,都會回收只被弱引用關聯的對象。在JDK 1.2以後,提供了WeakReference類來實現弱引用。

虛引用(PhantomReference):這個引用po主沒有提到,不過也能夠順帶了解一下。虛引用也稱幽靈引用或者幻影引用,它是最弱的一種引用關係。一個對象是否有虛引用的存在,徹底不會對其生存時間構成影響,也沒法經過虛引用來取得一個對象實例。爲一個對象設置虛引用的惟一目的就是在這個對象被GC回收是收到一個系統通知。在JDK 1.2以後提供了PhantomReference類來實現虛引用。

9.你應用中的網絡層是怎麼設計的? 
1. android-async-http. 
封裝了下經常使用的方法,get post 上傳 下載 ,全部的請求我都是用的同步請求. 
具體的用法通常都是和業務邏輯在一塊兒,而個人業務邏輯是用異步去處理的. 
關於網絡請求結果的緩存,我是單獨處理的.並無放在網絡層.

2.在HttpUrlConnection基礎上封裝, 包括請求成功, 失敗, 請求中, 網絡問題等封裝, 利用廣播與UI交互 
3.直接使用xUtils,afinal,okHttp,Volley等開源第三方框架;

Bitmap是android中常用的一個類,它表明了一個圖片資源。 
Bitmap消耗內存很嚴重,若是不注意優化代碼,常常會出現OOM問題,優化方式一般有這麼幾種: 
1. 使用緩存; 
2. 壓縮圖片; 
3. 及時回收;

10.談談你對Bitmap的理解, 何時應該手動調用bitmap.recycle()? 
至於何時須要手動調用recycle,這就看具體場景了,原則是當咱們再也不使用Bitmao時,須要回收之。另外,咱們須要注意,2.3以前Bitmap對象與像素數據是分開存放的,Bitmap對象存在Java Heap中而像素數據存放在Native Memory中,這時頗有必要調用recycle回收內存。可是2.3以後,Bitmap對象和像素數據都是存在Heap中,GC能夠回收其內存。

11.ViewPager中加載Fragment的優化問題?如何作到微信那樣切換界面時的延時加載? 
利用fragment中的setUserVisibleHint這個方法能夠來作到.

private boolean hasLoadedOnce = false; // your boolean field @Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); if (this.isVisible()) { // we check that the fragment is becoming visible if (isVisibleToUser && !hasLoadedOnce) { //do something } } } }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

12什麼是aar?aar和jar有什麼區別? 
「aar」包是 Android 的類庫項目的二進制發行包。

文件擴展名是.aar,maven 項目類型應該也是aar,但文件自己是帶有如下各項的 zip 文件:

/AndroidManifest.xml (mandatory) 
/classes.jar (mandatory) 
/res/ (mandatory) 
/R.txt (mandatory) 
/assets/ (optional) 
/libs/*.jar (optional) 
/jni//*.so (optional) 
/proguard.txt (optional) 
/lint.jar (optional) 
這些條目是直接位於 zip 文件根目錄的。 
其中R.txt 文件是aapt帶參數–output-text-symbols的輸出結果。

jar打包不能包含資源文件,好比一些drawable文件、xml資源文件之類的,aar能夠。

13.如何加密Url防止被黑? 
加密到JNI裏面仍是會經過抓包工具抓取到.最後的方式就是進行HTTPS證書雙向加密驗證

14.Android fragment和activity的區別 
你能夠理解Fragment是一種特殊的View,負責一個模塊或者一個特殊部分的展現。 
大部分Fragment是依託於Activity存在的,由Activity的FragmentManager來管理 
Fragment能夠解決多Activity的問題,即將3.0以前的頻繁Activity跳轉改爲一個Activity內Fragment的切換。 
Fragment能夠解決碎片化的問題。 
fragment是android3.0新增的 
fragment能夠重用 
fragment必須嵌套在activity中使用,它的生命週期受activity的影響。

15.Service和廣播 BroadcastReceivre會不會出現ANR? 
Service,廣播 會出現ANR 
服務, 廣播都是主線程中, 既然是主線程 固然會anr 因此耗時操做仍是必須另起線程 
通俗的說超時時間:Activity 5秒, Broadcast 10秒, Server 20秒

16.你在平時開發中會使用到哪些設計模式,能談談這些設計模式的使用場景嗎? 
平時用的比較多有單例模式(在內存中僅實例化一個對象時使用),適配器模式(典型的就是ListView和GridView的適配器),建造者模式(AlertDialog.Builder),觀察者模式可能比較隱蔽,在Android源碼中BaseAdapater的NotifyDataSetChanged的實現(?) 
單例:DownloadManager

 
8
0
相關文章
相關標籤/搜索