Android開發 -- Jetpack 之 Lifecycles 快速入門、簡單使用、通俗解釋

全文閱讀預計 10 分鐘

這可能是你看過的最清晰明瞭的講解

主題 👇

場景說明:日常開發中,我們可能會在某個耗時接口、線程中做些操作,耗時的操作執行完畢後更改界面上某個 UI 的展示,但如果此時接口、線程還在工作但 Activity 已經關掉了呢?那麼就會造成內存泄漏等問題,回顧內存泄漏的定義:生命週期長的對象持有生命週期短對象的引用就可能會造成內存泄漏,那麼此時我們可能會在 ActivityonDestory 中停止掉這些耗時操作,如果你的程序中很多地方都需要在這種生命週期的地方做操作,越往後就越難以管理,那麼 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());
    }
}

運行一下,你會發現當 SecondActivityonResume 執行時 MyObserverconnect 方法也會被執行,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 JetpackLiveData、ViewModel 學習,它們將便於你對於項目的維護,讓你減少更多的時間用在諸如內存泄漏、配置更改(屏幕旋轉後的數據處理問題)等常見問題上。

而且,我也推薦你對於 MVVM 框架的學習,有了它,會大幅提高你的日常開發效率。

想嘗試一下 LiveData請進入此鏈接學習我對於 LiveData 的快速及通俗講解。 全文閱讀預計 15 分鐘。

想嘗試一下 ViewModel請進入此鏈接學習我對於 ViewModel 的快速及通俗講解。 全文閱讀預計 10 分鐘。

想嘗試一下 MVVM 框架請進入此鏈接學習我對於 MVVM框架 的快速及通俗講解。 全文閱讀預計 10 分鐘。

碼字不易,還請動動小手左側欄中點贊 👍,3Q

發佈了15 篇原創文章 · 獲贊 7 · 訪問量 3002
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章