Android lifecycle 使用詳解javascript
Android livedata 源碼解剖github
github sample 地址: ArchiteComponentsSampleide
Android Architecture Components 的,前面咱們已經講解了 lifecycle, LiveData 的使用及原理,今天,讓咱們一塊兒賴看看 lifecycle 在項目中的實戰。主要講解兩點oop
咱們平時在使用 handler 的時候,在 activity onDestroy 的時候,須要手動取 removeMessage 或者 removeCallBack,否則的話,很容易發生內存泄漏。this
@Override
protected void onDestroy() {
super.onDestroy();
mHandler.removeCallbacksAndMessages(null);
}
複製代碼
這對咱們開發者來講,很明顯是一個重複的動做。咱們一塊兒經過 lifecycle 來減小這種重複性的動做,讓其內部本身釋放。spa
核心原理其實很簡單,內部監聽 activity 生命週期的變化,在 onDestroy 的時候移除 message 和 callback。.net
public class LifecycleHandler extends Handler implements FullLifecycleObserver {
private LifecycleOwner mLifecycleOwner;
public LifecycleHandler(LifecycleOwner lifecycleOwner) {
mLifecycleOwner = lifecycleOwner;
addObserver();
}
public LifecycleHandler(LifecycleOwner lifecycleOwner, Callback callback) {
super(callback);
mLifecycleOwner = lifecycleOwner;
addObserver();
}
public LifecycleHandler(LifecycleOwner lifecycleOwner, Looper looper) {
super(looper);
mLifecycleOwner = lifecycleOwner;
addObserver();
}
public LifecycleHandler(LifecycleOwner lifecycleOwner, Looper looper, Callback callback) {
super(looper, callback);
mLifecycleOwner = lifecycleOwner;
addObserver();
}
private void addObserver() {
if (mLifecycleOwner != null) {
mLifecycleOwner.getLifecycle().addObserver(new FullLifecycleObserverAstrong textdapter(mLifecycleOwner, this));
}
}
@Override
public void onCreate(LifecycleOwner owner) {
}
@Override
public void onStart(LifecycleOwner owner) {
}
@Override
public void onResume(LifecycleOwner owner) {
}
@Override
public void onPause(LifecycleOwner owner) {
}
@Override
public void onStop(LifecycleOwner owner) {
}
@Override
public void onDestroy(LifecycleOwner owner) {
removeCallbacksAndMessages(null);
}
}
複製代碼
咱們來看一下這一行代碼
mLifecycleOwner.getLifecycle().addObserver(new FullLifecycleObserverAdapter(mLifecycleOwner, this));
複製代碼
FullLifecycleObserverAdapter 是什麼呢?
FullLifecycleObserverAdapter
public class FullLifecycleObserverAdapter implements LifecycleObserver {
private final FullLifecycleObserver mObserver;
private static final String TAG = "FullLifecycleObserverAd";
private final LifecycleOwner mLifecycleOwner;
FullLifecycleObserverAdapter(LifecycleOwner lifecycleOwner, FullLifecycleObserver observer) {
mLifecycleOwner = lifecycleOwner;
mObserver = observer;
}
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
public void onCreate() {
Log.i(TAG, "onCreate: ");
mObserver.onCreate(mLifecycleOwner);
}
@OnLifecycleEvent(Lifecycle.Event.ON_START)
public void onStart() {
Log.i(TAG, "onStart: ");
mObserver.onStart(mLifecycleOwner);
}
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
public void onResume() {
Log.i(TAG, "onResume: ");
mObserver.onResume(mLifecycleOwner);
}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
public void onPause() {
Log.i(TAG, "onPause: ");
mObserver.onPause(mLifecycleOwner);
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
public void onStop() {
Log.i(TAG, "onStop: ");
mObserver.onStop(mLifecycleOwner);
}
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
public void onDestroy() {
Log.i(TAG, "onDestroy: ");
mObserver.onDestroy(mLifecycleOwner);
}
}
複製代碼
FullLifecycleObserver
public interface FullLifecycleObserver extends LifecycleObserver {
void onCreate(LifecycleOwner owner);
void onStart(LifecycleOwner owner);
void onResume(LifecycleOwner owner);
void onPause(LifecycleOwner owner);
void onStop(LifecycleOwner owner);
void onDestroy(LifecycleOwner owner);
}
複製代碼
FullLifecycleObserver 是咱們本身自定義的一個接口,繼承 LifecycleObserver,各個方法一一對應 activity 的生命週期。
FullLifecycleObserverAdapter 實現了 LifecycleObserver,使用了 @OnLifecycleEvent 註解,在 activity 生命週期變化的時候會回調相應的方法,咱們再在裏面回調 observer 的 onCreate, onStart 等方法,這有點相似代理模式。調用關係總結以下:
之後想觀察 lifecycle 生命週期變化的話,只須要 mLifecycleOwner.getLifecycle().addObserver(new FullLifecycleObserverAdapter(mLifecycleOwner, this));
這一行代碼便可
有人可能會這樣問了,爲何要這樣設計呢
加 FullLifecycleObserver 這個接口,主要是爲了跟 activity 的生命週期一一對應。
public class LifecyclePresenter implements IPresenter, FullLifecycleObserver {
private static final String TAG = "BasePresenter";
private final LifecycleOwner mLifecycleOwner;
public LifecyclePresenter(LifecycleOwner lifecycleOwner) {
mLifecycleOwner = lifecycleOwner;
mLifecycleOwner.getLifecycle().addObserver(new FullLifecycleObserverAdapter(lifecycleOwner, this));
}
@Override
public void onCreate(LifecycleOwner owner) {
Log.i(TAG, "onCreate: owner = " + owner);
}
@Override
public void onStart(LifecycleOwner owner) {
Log.i(TAG, "onStart: owner = " + owner);
}
@Override
public void onResume(LifecycleOwner owner) {
Log.i(TAG, "onResume: owner = " + owner);
}
@Override
public void onPause(LifecycleOwner owner) {
Log.i(TAG, "onPause: owner = " + owner);
}
@Override
public void onStop(LifecycleOwner owner) {
Log.i(TAG, "onStop: owner = " + owner);
}
@Override
public void onDestroy(LifecycleOwner owner) {
Log.i(TAG, "onDestroy: owner = " + owner);
}
}
複製代碼
Android 技術人,一位不羈的碼農。