筆者由於在近期需要找工作,所以近期最主要的任務就是準備面試,不打無準備之仗。只有你準備充分了,那麼你想得到的機會才可能有機會入你懷中。
筆者會將準備面試的學習過程記錄下來,方便自己覆盤的同時也希望能給一道找工作的小夥伴們一些幫助。筆者準備的內容大綱如下
接下來開始本篇部落格的正菜:
什麼是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 對軟體的要求。