妥妥的去面試之Android基礎(五)

筆者由於在近期需要找工作,所以近期最主要的任務就是準備面試,不打無準備之仗。只有你準備充分了,那麼你想得到的機會纔可能有機會入你懷中。

筆者會將準備面試的學習過程記錄下來,方便自己覆盤的同時也希望能給一道找工作的小夥伴們一些幫助。筆者準備的內容大綱如下

7911186-9c84d76a4df01570.png
Android面試大綱.png

妥妥的去面試之Android基礎(一)

妥妥的去面試之Android基礎(二)

妥妥的去面試之Android基礎(三)

妥妥的去面試之Android基礎(四)

什麼是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 對軟件的要求。

面試系列的文章都放於 面試妥妥的 建議小夥伴們關注該專題

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章