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

樹獺非懶發表於2019-03-01

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

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

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 對軟體的要求。

相關文章