筆者由於在近期需要找工作,所以近期最主要的任務就是準備面試,不打無準備之仗。只有你準備充分了,那麼你想得到的機會纔可能有機會入你懷中。
筆者會將準備面試的學習過程記錄下來,方便自己覆盤的同時也希望能給一道找工作的小夥伴們一些幫助。筆者準備的內容大綱如下
什麼是OOM?
當前佔用的內存加上申請的內存資源超過了Dalvk虛擬機的最大內存限制就會拋出Out Of Memory異常。
有什麼方法可以避免OOM?
OOM在很多情況下都是因爲圖片加載問題,所以針對bitmap的優化可以在某種程度上避免OOM的發生
- 對圖片進行壓縮(通過採樣率)
- 及時釋放Bitmap內存
- 選擇合適的解碼方式
還有沒有其他的方法?
- 適當使用軟引用和弱引用
- 採用內存緩存和磁盤緩存
- 避免創建過多的對象,內存對象的重複利用(比如ListView中的convertview的複用)。
- 避免在Android中使用Enum,枚舉佔用的內存比整型大多了。
-避免在onDraw方法裏面執行對象的創建
說說你知道的內存泄露的場景?
1.靜態變量持有外部類的引用。
靜態變量和應用的生命週期一樣,因爲靜態變量持有外部類的引用,當外部類被銷燬時,就會導致外部類無法被GC,引起內存泄漏。所以儘量不要使用靜態變量。
2.單例模式引起的內存泄露
單例模式的對象的生命週期和應用程序一樣長,所以它持有的引用也不能被GC,所以會引起內存泄露。
所以在單例模式中,可以把單例對象的引用指向整個應用,就可以避免內存泄露。比如正確的單例模式寫法如下:
public class AppManager {
private static AppManager instance;
private Context context;
private AppManager(Context context) {
//this.context = context; //會引起內存泄漏
this.context = context.getApplicationContext(); //指向應用
}
public static AppManager getInstance(Context context) {
if (instance != null) {
instance = new AppManager(context);
}
return instance;
}
3.AsyncTask引起的內存泄露
AsyncTask是持有外部類的引用的,當它後臺任務沒有完成時,它會導致外部類的引用無法被回收,引起內存泄漏。
所以可以通過讓AsyncTask變成靜態內部類,這樣就不會持有外部類的引用了。
或者讓它持有外部類的弱引用。
4.使用完的資源未關閉
比如說在Bitmap在使用完後一定要關閉資源(調用它的recycle方法)
5.註冊沒取消造成的內存泄漏
比如調用registerReceiver後未調用unregisterReceiver。
廣播註冊一般有幾種,各有什麼優缺點?
- 第一種是常駐型(靜態註冊):當應用程序關閉後如果有信息廣播來,程序也會被系統調用,自己運行。
- 第二種不常駐(動態註冊):廣播會跟隨程序的生命週期。
動態註冊
優點: 在android的廣播機制中,動態註冊優先級高於靜態註冊優先級,因此在必要情況下,是需要動態註冊廣播接收者的。
缺點: 當用來註冊的 Activity 關掉後,廣播也就失效了。
靜態註冊
優點: 無需擔憂廣播接收器是否被關閉,只要設備是開啓狀態,廣播接收器就是打開着的。
Recyclerview和Listview的區別
- 在ListView中,ViewHolder需要自己來定義。通過ViewHolder可以緩存item裏的view控件實例,避免了在getview中重複創建帶來的性能損耗,但這只是一種推薦的使用方式,不是必須使用的。而在RecyclerView中使用RecyclerView.ViewHolder則變成了必須,儘管實現起來稍顯複雜,但是在性能提升上有很大的好處。
- ListView只能在垂直方向上滾動,Android API沒有提供直接讓ListView在水平方向上面滾動的支持。但RecyclerView提供了多種類型的展示方式,很容易就能修改展示方式。
。 - ListView對item的點擊事件實現較爲簡單,Recyclerview的點擊事件實現就相對複雜,但靈活性高。
- ListView沒有提供局部刷新,RecyclerView提供了局部刷新的方法,而且在局部刷新的時候有一個漸變的動畫效果。
說說安卓爲啥要加簽名機制?
- 用於發送者的身份驗證。由於開發商可能通過使用相同的 Package Name 來混淆替換已經安裝的程序,以此保證簽名不同的包不被替換。
- 保證信息傳輸的完整性。簽名對於包中的每個文件進行處理,以此確保包中內容不被替換。
- 防止交易中的抵賴發生, Market 對軟件的要求。
面試系列的文章都放於 面試妥妥的 建議小夥伴們關注該專題