Android Jetpack コンポーネントの学習 (1): LifeCycle

序文

Lifecycle は Google が Activity や Fragment のライフサイクルに関する問題に対処するために立ち上げたコンポーネントで、オブザーバーモードの構造です。

lifeCycle を使用すると、ライフサイクルの所有者とオブザーバーの間に監視関係を確立できます. 所有者のライフサイクルが変化すると、オブザーバーは時間内にそれを監視し、対応する処理を行うことができます. 同時に、オブザーバーは現在の状況を判断できます.非常に便利な状態 所有者の寿命は何ですか。

上記の説明から、LifeCycle の使用シナリオは、Activity と Fragment のライフサイクルに関するビジネス ロジックであることは明らかです。

たとえば、MVP 構造では、Presenter は Activity または Fragment のライフ サイクルを認識して、ライフ サイクルに関連するビジネス ロジックをタイムリーに処理できる必要があります。タイムリーな意思決定を行うために、ライフサイクルを観察します。

1.使用する

LifeCycle は主に、LifeCycleOwner と LifeCycleObserver の 2 つの部分に分けられます。

1.LifeCycleOwner

ライフサイクルの所有者である LifeCycleOwner は、一般的に Activity と Fragment を指し、カスタマイズの制限が非常に大きいため、今回は説明しません。

V4 の AppCompatActivity と Fragment の両方がデフォルトで LifeCycleOwner インターフェイスを実装しているため、開発で直接使用できます。

2.ライフサイクルオブザーバー

LifeCycleObserver、ライフ サイクル オブザーバーは、このインターフェイスを実装する必要があります。
このインターフェースにはメソッドはありません. ライフサイクルの監視はonLifecycleEventにアノテーションを付けることで実現されます. サンプルコードは次のとおりです.

class SingleMainLifeCycle : LifecycleObserver {
    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    fun onActivityOnCreate() {

    }

    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    fun onActivityOnResume() {

    }
}

このようにして、LifeCycleObserver インスタンスを作成し、オブザーバーを所有者に接続して、監視できるようにします. サンプル コードは次のとおりです。

class SingleMainActivity : BaseActivity<ActivitySingleMainBinding>() {

    override var viewBinding: ActivitySingleMainBinding = ActivitySingleMainBinding.inflate(layoutInflater)

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        //绑定lifecycle观察者
        lifecycle.addObserver(SingleMainLifeCycle())
    }
}

上記のコードでは、LifeCycleOwner インターフェースが Activity に実装されているため、getLifeCycle()このメソッドを直接使用してバインディングのライフサイクルを取得できます。バインド後、SingleMainLifeCycle のメソッドが対応するライフ サイクルで実行されます。

3. ライフサイクルの実行によって到達した状態を決定する

ライフサイクルは、現在のライフサイクルが特定の状態に達したかどうか、つまり現在の状態以上かどうかを判断できます。コードは次のとおりです。

        if(lifecycle.currentState.isAtLeast(Lifecycle.State.RESUMED)){

        }

2. ソースコードの概要分析

以下にソースコードの概要を示します. Fragment を例にとると, getLifeCycle()Fragment の表示方法は次のようになります.

    @Override
    @NonNull
    public Lifecycle getLifecycle() {
        return mLifecycleRegistry;
    }

LifeCycleOwner実装されたインターフェース、mLifecycleRegistry それぞれでありperformStart()performResume他の実行メソッドが呼び出されます

mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.**);

次のように、このメソッドを確認してください。

    public void handleLifecycleEvent(@NonNull Lifecycle.Event event) {
        State next = getStateAfter(event);
        moveToState(next);
    }

    private void moveToState(State next) {
        if (mState == next) {
            return;
        }
        mState = next;
        if (mHandlingEvent || mAddingObserverCounter != 0) {
            mNewEventOccurred = true;
            // we will figure out what to do on upper level.
            return;
        }
        mHandlingEvent = true;
        sync();
        mHandlingEvent = false;
    }

sync()メソッドの実行によって他のオブザーバーと同期されます

    private void sync() {
        LifecycleOwner lifecycleOwner = mLifecycleOwner.get();
        if (lifecycleOwner == null) {
            throw new IllegalStateException("LifecycleOwner of this LifecycleRegistry is already"
                    + "garbage collected. It is too late to change lifecycle state.");
        }
        while (!isSynced()) {
            mNewEventOccurred = false;
            // no need to check eldest for nullability, because isSynced does it for us.
            if (mState.compareTo(mObserverMap.eldest().getValue().mState) < 0) {
                backwardPass(lifecycleOwner);
            }
            Entry<LifecycleObserver, ObserverWithState> newest = mObserverMap.newest();
            if (!mNewEventOccurred && newest != null
                    && mState.compareTo(newest.getValue().mState) > 0) {
                forwardPass(lifecycleOwner);
            }
        }
        mNewEventOccurred = false;
    }

このメソッドには 2 つのメソッドがありbackwardPass()forwardPass()同期処理を実行します.backwardPass()例を挙げると、すべての Observer に対してmObserverMapトラバースし、実行しdispatchEvent()、状態を同期します。

    private void backwardPass(LifecycleOwner lifecycleOwner) {
        Iterator<Entry<LifecycleObserver, ObserverWithState>> descendingIterator =
                mObserverMap.descendingIterator();
        while (descendingIterator.hasNext() && !mNewEventOccurred) {
            Entry<LifecycleObserver, ObserverWithState> entry = descendingIterator.next();
            ObserverWithState observer = entry.getValue();
            while ((observer.mState.compareTo(mState) > 0 && !mNewEventOccurred
                    && mObserverMap.contains(entry.getKey()))) {
                Event event = downEvent(observer.mState);
                pushParentState(getStateAfter(event));
                observer.dispatchEvent(lifecycleOwner, event);
                popParentState();
            }
        }
    }

代わりに、mObserverMapストレージに使用されLifecycleObserver、バインドされたメソッドが呼び出されると、リスナーがこのデータ構造に追加されます。

要約する

LifeCycle はオブザーバー モードを採用して LifeCycleOwner のライフ サイクルを監視し、オブザーバーは対応するアクションをタイムリーに実行できます。
Jetpack の比較的独立したコンポーネントとして、LifeCycle はそれ自体に多くの利点があります。同時に、LiveData や ViewModel のライフサイクルも Lifecycle フレームワークに依存するなど、他の多くのコンポーネントの基本的なコンテンツです。

おすすめ

転載: blog.csdn.net/cat_is_so_cute/article/details/121230103