筆者由於在近期需要找工作,所以近期最主要的任務就是準備面試,不打無準備之仗。只有你準備充分了,那麼你想得到的機會纔可能有機會入你懷中。
筆者會將準備面試的學習過程記錄下來,方便自己覆盤的同時也希望能給一道找工作的小夥伴們一些幫助。筆者準備的內容大綱如下
接下來開始本篇博客的正菜:
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傳遞數據爲什麼需要序列化?
序列化,表示將一個對象轉換成可存儲或可傳輸的狀態。
需要序列化的原因有三種情況:
- 永久性保存對象,將對象的字節序列存儲到本地文件中;
- 對象在網絡中傳遞;
- 對象在IPC間傳遞。