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

筆者因爲在近期須要找工做,因此近期最主要的任務就是準備面試,不打無準備之仗。只有你準備充分了,那麼你想獲得的機會纔可能有機會入你懷中。android

筆者會將準備面試的學習過程記錄下來,方便本身覆盤的同時也但願能給一道找工做的小夥伴們一些幫助。筆者準備的內容大綱以下面試

Android面試大綱.png

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

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

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

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

接下來開始本篇博客的正菜:學習

什麼是OOM?

當前佔用的內存加上申請的內存資源超過了Dalvk虛擬機的最大內存限制就會拋出Out Of Memory異常。優化

有什麼方法能夠避免OOM?動畫

OOM在不少狀況下都是由於圖片加載問題,因此針對bitmap的優化能夠在某種程度上避免OOM的發生ui

  • 對圖片進行壓縮(經過採樣率)
  • 及時釋放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 對軟件的要求。
相關文章
相關標籤/搜索