全文閱讀預計 10 分鐘
這可能是你看過的最清晰明瞭的講解
主題 👇
場景說明:日常開發中,我們可能會在某個
耗時
的接口、線程
中做些操作,耗時的操作執行完畢後更改界面上某個UI
的展示,但如果此時接口、線程
還在工作但Activity
已經關掉了呢?那麼就會造成內存泄漏等問題,回顧內存泄漏的定義:生命週期長的對象持有生命週期短對象的引用就可能會造成內存泄漏
,那麼此時我們可能會在Activity
的onDestory
中停止掉這些耗時操作,如果你的程序中很多地方都需要在這種生命週期的地方做操作,越往後就越難以管理,那麼Jetpack 的 Lifecycles
就是爲了便於我們更好的處理這些情況。
Lifecycles
包含有關Activity、Fragment
生命週期狀態的信息,並允許
其他對象觀察此狀態
- 可以用它來觀察組件
Activity、Fragment
的生命週期狀態
使用 👇
首先,確定幾點
- 如果你使用的是
AppCompatActivity
那麼寫法就會很簡單 - 如果你不是上面這種而是直接用的
Activity
那麼稍微就多了些代碼
如果你用的是 AppCompatActivity
// 第一步
// 我們先創建一個 Observer
// 對於對觀察者模式還沒有了解的請先移步到觀察者的學習,很簡單的
class MyObserver implements LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
public void connect() {
Log.e("test", "連接正常");
}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
public void disConnect() {
Log.e("test", "斷開連接");
}
}
// 第二步
// 如果你使用的是 AppCompatActivity 那麼就會很簡單
public class SecondActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
// 只是比常規多了一行這個
getLifecycle().addObserver(new MyObserver());
}
}
運行一下,你會發現當
SecondActivity
的onResume
執行時MyObserver
的connect
方法也會被執行,disConnect
方法亦是同理
如果你用的是 Activity
// 其實也很簡單
// 首先 implements LifecycleOwner
// 然後在想要傳遞事件的地方通過 markState 傳遞事件(也就是 markState 傳的是 PAUSE 那麼 MyObserver 中註解 @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE) 的 disConnect 方法就會執行)
public class ThirdActivity extends Activity implements LifecycleOwner {
private LifecycleRegistry mLifecycleRegistry;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
mLifecycleRegistry = new LifecycleRegistry(this);
// 將 MyObserver 綁定上去
getLifecycle().addObserver(new MyObserver());
mLifecycleRegistry.markState(Lifecycle.State.CREATED);
}
@Override
protected void onResume() {
super.onResume();
mLifecycleRegistry.markState(Lifecycle.State.RESUMED);
}
@NonNull
@Override
public Lifecycle getLifecycle() {
return mLifecycleRegistry;
}
}
Ok,這樣就寫好了
當然,你也可以稍作改造,使它更加易用,一起來看看吧~
// 只是給 MyObserver 增加了一個接口
class MyObserver implements LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
public void connect() {
mListener.onRefresh("連接正常");
}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
public void disConnect() {
mListener.onRefresh("斷開連接");
}
private OnRefreshListener mListener;
interface OnRefreshListener{
void onRefresh(String option);
}
void setOnRefreshListener(OnRefreshListener listener){
this.mListener = listener;
}
}
// 只是給 Activity or AppCompatActivity 的 onCreate 綁定觀察者的地方做了小修改
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
mLifecycleRegistry = new LifecycleRegistry(this);
MyObserver observer = new MyObserver();
observer.setOnRefreshListener(new MyObserver.OnRefreshListener() {
@Override
public void onRefresh(String option) {
if(option.equals("連接正常")){
// do something
} else if(option.equals("斷開連接")){
// do something
}
}
});
getLifecycle().addObserver(observer);
mLifecycleRegistry.markState(Lifecycle.State.CREATED);
}
很簡單的使用方式就完成了,你可以在 do something
的區域中做任何事
文末 👇
同時
我在這裏也向你推薦關於 Android Jetpack
的 LiveData、ViewModel
學習,它們將便於你對於項目的維護,讓你減少更多的時間用在諸如內存泄漏、配置更改(屏幕旋轉後的數據處理問題)
等常見問題上。
而且,我也推薦你對於 MVVM
框架的學習,有了它,會大幅提高你的日常開發效率。
想嘗試一下 LiveData ?請進入此鏈接學習我對於 LiveData 的快速及通俗講解。 全文閱讀預計 15 分鐘。
想嘗試一下 ViewModel ?請進入此鏈接學習我對於 ViewModel 的快速及通俗講解。 全文閱讀預計 10 分鐘。
想嘗試一下 MVVM 框架 ?請進入此鏈接學習我對於 MVVM框架 的快速及通俗講解。 全文閱讀預計 10 分鐘。
碼字不易,還請動動小手左側欄中點贊 👍,3Q