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

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

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

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

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

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

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

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

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或服務之間怎麼通信?

啓動服務兩種方式

1.startService

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間傳遞
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章