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

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

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

Android面試大綱.png

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

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

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

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

1.Bitmap使用時須要注意什麼?

  • 要選擇合適的圖片規格,由於不一樣規格的圖片所佔用的內存不一樣

ALPHA_8 每一個像素佔用1byte內存
ARGB_4444 每一個像素佔用2byte內存
ARGB_8888 每一個像素佔用4byte內存(默認)
RGB_565 每一個像素佔用2byte內存性能

  • 圖片壓縮。經過BitmapFactory對圖片進行壓縮,這樣就會下降內存佔用從而在必定程度上避免OOM,提升Bitmap加載時的性能。
  • 複用內存。經過軟引用(內存不夠的時候纔會回收掉)來複用內存塊,就不須要再從新給這個bitmap申請一塊新的內存,避免了一次內存的分配和回收帶來的性能消耗。
  • 使用recycle()方法及時回收內存,避免內存泄露。

在Android中,Bitmap的存儲分爲兩部分,一部分是Bitmap的數據,一部分是Bitmap的引用。 在Android2.3時代,Bitmap的引用是放在堆中的,而Bitmap的數據部分是放在棧中的,須要用戶調用recycle方法手動進行內存回收,而在Android2.3以後,整個Bitmap,包括數據和引用,都放在了堆中,這樣,整個Bitmap的回收就所有交給GC了,這個recycle方法就不再須要使用了。學習

2.服務有幾種啓動方式?服務和Activty或服務之間怎麼通訊?

啓動服務兩種方式this

1.startServicespa

onCreate() --> onStartCommand() --> onDestroy()

  • 若是服務已經開啓,再次開啓的話不會重複的執行onCreate(), 而是會調用onStartCommand()。
  • 一旦服務開啓後就和開啓者沒有任何關係了。
  • 開啓者不能調用服務裏面的方法。

2.bindService

onCreate() --> onBind() --> onUnbind() --> onDestroy()

bind的方式開啓服務後,若是開啓者被銷燬了,它也會跟着一塊兒銷燬。綁定者能夠調用服務裏的方法。

3.通訊方式

服務和Activity、服務和服務之間能夠經過Binder對象、Broadcast(廣播)進行通訊。

3.Handler爲何會出現內存泄漏,爲何繼承Handle就不會出現內存泄漏?

在使用Handler的時候,每每是須要在子線程中作耗時任務的,可是當任務未執行完就把該Handler所在的Activity銷燬的話,它是沒法被GC的。由於持有非靜態內部類的引用是沒法被內存回收,因此會出現內存泄露。

解決方法主要在於兩點:

  • 將Handler聲明爲靜態內部類。由於靜態內部類不會持有外部類的引用,因此不會致使外部類實例出現內存泄露。
  • 在Handler中添加對外部Activity的弱引用。因爲Handler被聲明爲靜態內部類,再也不持有外部類對象的引用,致使沒法在handleMessage()中操做Activity中的對象,因此須要在Handler中增長一個對Activity的弱引用。

經過繼承Handler就能夠實現一個Handler靜態內部類,還能夠在構造方法中添加對外部Activity的弱引用。

public class MainActivity extends Activity {
    ......
 
    private final MyHandler mHandler = new MyHandler(this);
 
    private static class MyHandler extends Handler {
        private final WeakReference<MainActivity> mActivity;
 
        public MyHandler(MainActivity activity) {
            this.mActivity = new WeakReference<MainActivity>(activity);
        }
 
        @Override
        public void handleMessage(Message msg) {
          
        }
    }
}

複製代碼

4.在Activity中建立一個thread跟在service中建立一個thread之間的區別?

  • 在Activity中被建立:該Thread的就是爲這個Activity服務的,完成這個特定的Activity交代的任務,主動通知該Activity一些消息和事件,Activity銷燬後,該Thread也沒有存活的意義了
  • 在Service中被建立:這是保證最長生命週期的Thread的惟一方式,只要整個Service不退出,Thread就能夠一直在後臺執行,通常在Service的onCreate()中建立,在onDestroy()中銷燬。因此,在Service中建立的Thread,適合長期執行一些獨立於APP的後臺任務,比較常見的就是:在Service中保持與服務器端的長鏈接。

5.Bundle傳遞數據爲何須要序列化?

序列化,表示將一個對象轉換成可存儲或可傳輸的狀態。

須要序列化的緣由有三種狀況:

  1. 永久性保存對象,將對象的字節序列存儲到本地文件中;
  2. 對象在網絡中傳遞
  3. 對象在IPC間傳遞
相關文章
相關標籤/搜索