lifecycleregistry的handlelifecycleevent是否给了我错误的事件回调?什么改变了?

myss37ts  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(390)

直到几周前,我的LifecycleOwneraWareObservator课程还不错。
它的设计目的是在破坏时自动分离。

  1. @Override
  2. public void onStateChanged(@NonNull LifecycleOwner source, @NonNull Lifecycle.Event event) {
  3. Log.d(TAG, "onStateChanged: event is: " + event.name());
  4. Lifecycle.State state = source.getLifecycle().getCurrentState();
  5. Log.println(Log.WARN, TAG, "onStateChanged: state is: " + state.name());
  6. if (state.isAtLeast(INITIALIZED) && !state.equals(DESTROYED)) {
  7. observer.get().accept(event);
  8. } else if (state.equals(DESTROYED)) {
  9. observer.get().accept(event);
  10. observer.set(() -> null);
  11. source.getLifecycle().removeObserver(this);
  12. }
  13. }

其想法是构建生命周期感知组件来处理自动注销。
我90%的项目依赖于这个组件。。。
我没有察觉到任何变化,特别是在适配器上,它监听片段,这是我看到的唯一一个奇怪的行为,onviewcreated(一个on\u start回调将一个观察者附加到片段的lifecycleownerlivedata)在真正的onviewcreated()之后被稍微触发,但只有在从backbackback回来时才触发。。。这一点都不好,但如果采取一些预防措施,它可能会被忽略。
但这是最奇怪的。。。
我有一个自定义视图(viewparticle.class),它有自己的生命周期,实现了生命周期注册表。
这个代码几周前还在运行。。。由于我没有不断地测试所有的东西,我不确定在什么时候停止工作这里是代码:

  1. private final MyLifeCycleOwner mViewLifecycleOwner = new MyLifeCycleOwner();
  2. @Override
  3. public void viewDestroyed() {
  4. Lifecycle.Event event = Lifecycle.Event.ON_DESTROY;
  5. Log.d(TAG, "viewDestroyed: event is: " + event.toString());
  6. mViewLifecycleOwner.handleLifecycleEvent(event);
  7. }

接收端:

  1. @Override
  2. public void viewPrepared() {
  3. lifecycleSupplier = () -> mViewLifecycleOwner;
  4. Lifecycle lCRef = mViewLifecycleOwner.getLifecycle();
  5. //The callback HERE!!
  6. lCRef.addObserver(
  7. new LifeCycleOwnerAwareObserver(
  8. event -> {
  9. Log.d(TAG, "viewPrepared: event is: " + event.name());
  10. if (event.equals(Lifecycle.Event.ON_DESTROY)) lastResponseProvider.run();
  11. }
  12. )
  13. );
  14. lifeCycleProvider.run();
  15. mViewLifecycleOwner.handleLifecycleEvent(Lifecycle.Event.ON_CREATE);
  16. mViewLifecycleOwner.handleLifecycleEvent(Lifecycle.Event.ON_START);
  17. }

当执行viewdestroyed()时,日志显示:

  1. D/ViewParticle: viewDestroyed: event is: ON_DESTROY
  2. D/MyLifeCycleOwner: handleLifecycleEvent: event is: ON_DESTROY
  3. D/LifeCycleOwnerAwareObse: onStateChanged: event is: ON_STOP
  4. W/LifeCycleOwnerAwareObse: onStateChanged: state is: DESTROYED
  5. D/ViewParticle: viewPrepared: event is: ON_STOP

你可以看到 Event.ON_DESTROY 枚举正在转换为:a) Lifecycle.State.DESTROYED (二) Lifecycle.Event.ON_STOP 这是不可能的,因为getstateafter()方法如下所示:

  1. static State getStateAfter(Event event) {
  2. switch (event) {
  3. case ON_CREATE:
  4. case ON_STOP:
  5. return CREATED;
  6. case ON_START:
  7. case ON_PAUSE:
  8. return STARTED;
  9. case ON_RESUME:
  10. return RESUMED;
  11. case ON_DESTROY:
  12. return DESTROYED;
  13. case ON_ANY:
  14. break;
  15. }
  16. throw new IllegalArgumentException("Unexpected event value " + event);
  17. }

这意味着一个事件永远不会与一个状态不同,因为一个状态是一个事件的产物,而触发/开始回调的是事件,而不是状态。
这意味着,如果状态被销毁,则事件必须处于销毁状态。
我无法解释这里发生了什么。。

093gszye

093gszye1#

我不会过多研究这个问题,但乍一看答案似乎在这里:

  1. while (!isSynced()) {
  2. mNewEventOccurred = false;
  3. // no need to check eldest for nullability, because isSynced does it for us.
  4. if (mState.compareTo(mObserverMap.eldest().getValue().mState) < 0) {
  5. backwardPass(lifecycleOwner);
  6. }
  7. Entry<LifecycleObserver, ObserverWithState> newest = mObserverMap.newest();
  8. if (!mNewEventOccurred && newest != null
  9. && mState.compareTo(newest.getValue().mState) > 0) {
  10. forwardPass(lifecycleOwner);
  11. }
  12. }

这个 backwardPass(lifecycleOwner); 以及 forwardPass(lifecycleOwner); 方法,似乎是在假设 mState.compareTo(newest.getValue().mState) > 0 以及 mState.compareTo(mObserverMap.eldest().getValue().mState) < 0 条件永远不会大于1,因此即使答案是“true,因为它是2”,forwardpass()方法也只会在生命周期中提前一个节点,从它以前的值开始。。。这种行为使得 getStateAfter(Event event) 方法没有意义。
顺便说一句,我记得这句话在这条线上给了我很多问题:

  1. mViewLifecycleOwner.handleLifecycleEvent(Lifecycle.Event.ON_CREATE);
  2. mViewLifecycleOwner.handleLifecycleEvent(Lifecycle.Event.ON_START);

在我上面的代码中,这意味着这实际上给了我以前的问题,所以现在需要澄清的奇怪的事情是,为什么它一开始工作得很好?idk公司。
答案是:

  1. @Override
  2. public void viewDestroyed() {
  3. Lifecycle.Event event = Lifecycle.Event.ON_STOP;
  4. Log.d(TAG, "viewDestroyed: event is: " + event.toString());
  5. mViewLifecycleOwner.handleLifecycleEvent(event);
  6. Lifecycle.Event event2 = Lifecycle.Event.ON_DESTROY;
  7. Log.d(TAG, "viewDestroyed: event is: " + event.toString());
  8. mViewLifecycleOwner.handleLifecycleEvent(event2);
  9. }

要求是需要按顺序遍历枚举,直到达到所需的程度。

  1. public enum Event {
  2. ON_CREATE,
  3. ON_START,
  4. ON_RESUME,
  5. ON_PAUSE,
  6. ON_STOP,
  7. ON_DESTROY,
  8. ON_ANY
  9. }

现在看来,唯一可跳过的枚举是: ON_RESUME 以及 ON_PAUSE

展开查看全部

相关问题