LifeCycle原理分析

简述

解耦是永恒不变的话题,但是又不得不做。平时在onCreate方法中初始化,在onDestory中回收资源,这样会使页面和组件之间的耦合度增加,不这样做又会造成内存泄漏。
我们希望对组件的管理,不仅仅是依赖生命周期函数的管理方法。LifeCycle正是因此出现的,组件就能够在内部自己管理自己的生命周期,从而降低模块间的耦合度,并降低内存泄漏的可能性。

LifeCycle的原理

LifeCycle是通过观察者模式,实现对页面生命周期的监听。Jetpack提供了两个类:

  • LifecycleObserver:观察者,BasePresenter等需要监控生命周期函数的地方
  • LifecycleOwner:被观察者,Activity、Fragment等

作为被观察者,Activity默认实现了LifecycleOwner接口,且该接口中只有一个getLifecycle(LifecycleObserver observer)方法。该方法是实现观察者模式的关键!

1.绑定观察者、被观察者

通过以下代码完成观察者、被观察者之间的绑定:

getLifecycle().addObserver(listener);

addObserver是LifeCycle.java的抽象方法:

@MainThread
public abstract void addObserver(@NonNull LifecycleObserver observer);

其实现在LifecycleRegistry.java中:

@Override
public void addObserver(@NonNull LifecycleObserver observer) {
  	//得到初始化状态,刚进来肯定是INITIALZED
    State initialState = mState == DESTROYED ? DESTROYED : INITIALIZED;
  	//observer就是表示层,谁实现了LifecycleObserver接口,谁就是Observer,谁就是观察者
  	//将观察者observer、初始化状态,封装到ObserverWithState中
    ObserverWithState statefulObserver = new ObserverWithState(observer, initialState);
  	//将observer、刚刚封装的ObserverWithState对象,添加到Map中去
    ObserverWithState previous = mObserverMap.putIfAbsent(observer, statefulObserver);

    省略......
}

上面做的就是将初始化状态、观察者都封装到一个ObserverWithState对象中,并将其存储到Map中去。添加到Map的操作:

@Override
public V putIfAbsent(@NonNull K key, @NonNull V v) {
    Entry<K, V> current = get(key);
    if (current != null) {
        return current.mValue;
    }
  	//以observer为K,将封装好的对象存储到HashMap中去
    mHashMap.put(key, put(key, v));
    return null;
}

//这里的mHashMap就是一个HashMap
private HashMap<K, Entry<K, V>> mHashMap = new HashMap<>();
//K:observer
//V:Entry<Observer,ObserverWithState对象>

经过这样的绑定,就能建立起观察者Observer和ObserverWithState的关联关系。

2.被观察者实现LifecycleOwn接口

作为被观察者,Activity、Fragment自身都实现了LifecycleOwner接口。以Activity的父类ComponentActivity为例,它的onCreate方法中有一个行为很显眼:

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mSavedStateRegistryController.performRestore(savedInstanceState);
  	//干了啥?跟Glide一样,添加了一个无UI的空Fragment来搞定生命周期问题
    ReportFragment.injectIfNeededIn(this);
    if (mContentLayoutId != 0) {
        setContentView(mContentLayoutId);
    }
}


//在ReportFragment中,利用FragmentManager添加了一个无UI的空Fragment(和Glide的骚操作一样)。
public static void injectIfNeededIn(Activity activity) {
        // ProcessLifecycleOwner should always correctly work and some activities may not extend
        // FragmentActivity from support lib, so we use framework fragments for activities
        android.app.FragmentManager manager = activity.getFragmentManager();
        if (manager.findFragmentByTag(REPORT_FRAGMENT_TAG) == null) {
            manager.beginTransaction().add(new ReportFragment(), REPORT_FRAGMENT_TAG).commit();
            // Hopefully, we are the first to make a transaction.
            manager.executePendingTransactions();
        }
    }

这样就很明显了,通过添加空Fragment达到掌控生命周期的目的。换句话说,监听这个空Fragment,就能解决生命周期的问题!
这样焦点就落在了这个Fragment的各个生命周期身上了。它们都干了一件事,就是分发事件dispatch(Lifecycle.Event.xxx):

//因为作为子类的Activity、Fragment都实现了LifecycleObserver接口,所以这里要用 instance of 判断
//一下到底实现了哪个接口。判断完事后,干的事都一样,继续分发事件
//这里dispatch接收的参数,就是被观察者当前所处的状态(ON_CREATE/ON_RESUME等)
private void dispatch(Lifecycle.Event event) {
    Activity activity = getActivity();
    if (activity instanceof LifecycleRegistryOwner) {
        ((LifecycleRegistryOwner) activity).getLifecycle().handleLifecycleEvent(event);
        return;
    }

    if (activity instanceof LifecycleOwner) {
        Lifecycle lifecycle = ((LifecycleOwner) activity).getLifecycle();
        if (lifecycle instanceof LifecycleRegistry) {
            ((LifecycleRegistry) lifecycle).handleLifecycleEvent(event);
        }
    }
}

handleLifecycleEvent分发分发事件:

//何为事件分发?只要页面处于/到达某个状态,Activity、Fragment的就会处于某个状态,即它们的生命周期
//也会相应的到达onCreate或onDestory...
//但凡被观察者要离开onCreate了,那么接下来必然要CREATED
//这里想都不要想,所以表示层观察者Observer也要随机进入到CREATED状态。
//所以,这里要获取当前状态的下一个状态,并将其移动到下一个状态
public void handleLifecycleEvent(@NonNull Lifecycle.Event event) {
  	//获取当前状态的下一个状态
    State next = getStateAfter(event);
  	//将表示层Observer移动到下一个状态
    moveToState(next);
}


//获取当前状态的下一个状态:
static State getStateAfter(Event event) {
        switch (event) {
            case ON_CREATE:
            case ON_STOP:
                return CREATED;
            case ON_START:
            case ON_PAUSE:
                return STARTED;
            case ON_RESUME:
                return RESUMED;
            case ON_DESTROY:
                return DESTROYED;
            case ON_ANY:
                break;
        }
        throw new IllegalArgumentException("Unexpected event value " + event);
    }


//移动到下一个状态
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()同步:

// 被观察者Activity、Fragment生命周期	<------>	观察者Observer(BasePresenter)存的初始化状态INITIALIZED
//目的:让观察者(BasePresenter)的状态值和被观察者的生命周期保持一致
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;
}

为了让观察者和被观察者的生命周期保持同步,需要在sync同步方法中根据情况适宜的向前推、向后推。以向后推为例:

private void backwardPass(LifecycleOwner lifecycleOwner) {
  	//从mObserverMap中取出所有的Entry<observer,ObserverWithState对象>
    Iterator<Entry<LifecycleObserver, ObserverWithState>> descendingIterator =
            mObserverMap.descendingIterator();
    while (descendingIterator.hasNext() && !mNewEventOccurred) {
        Entry<LifecycleObserver, ObserverWithState> entry = descendingIterator.next();
      	//取出Value:ObserverWithState对象
        ObserverWithState observer = entry.getValue();
        while ((observer.mState.compareTo(mState) > 0 && !mNewEventOccurred
                && mObserverMap.contains(entry.getKey()))) {
            Event event = downEvent(observer.mState);
          	//先push当前状态,备份保存
            pushParentState(getStateAfter(event));
          	//事件分发的精髓在这!
            observer.dispatchEvent(lifecycleOwner, event);
          	//最后pop状态,恢复,防异常
            popParentState();
        }
    }
}

事件分发的精髓,observer.dispatchEvent(lifecycleOwner, event)分发:

//静态类ObserverWithState,里面封装了观察者Observer、页面状态State
static class ObserverWithState {
    State mState;
    LifecycleEventObserver mLifecycleObserver;

    ObserverWithState(LifecycleObserver observer, State initialState) {
        mLifecycleObserver = Lifecycling.lifecycleEventObserver(observer);
        mState = initialState;
    }

    void dispatchEvent(LifecycleOwner owner, Event event) {
      	//获取下一个状态,最新值
        State newState = getStateAfter(event);
      	//用ObserverWithState中存的状态,和刚拿到的新状态,取最小
        mState = min(mState, newState);
      	//去修改状态了
        mLifecycleObserver.onStateChanged(owner, event);
      	//更新当前状态值
        mState = newState;
    }
}

在比较完状态后,就要去修改状态了mLifecycleObserver.onStateChanged(owner, event)。onStateChanged是接口LifecycleEventObserver中的接口方法,实现在ReflectiveGenericLifecycleObserver中:

class ReflectiveGenericLifecycleObserver implements LifecycleEventObserver {
  	//mWrapped ---> LifecycleObserver 指的就是观察者
    private final Object mWrapped;
    private final CallbackInfo mInfo;

    ReflectiveGenericLifecycleObserver(Object wrapped) {
        mWrapped = wrapped;
        mInfo = ClassesInfoCache.sInstance.getInfo(mWrapped.getClass());
    }

    @Override
    public void onStateChanged(@NonNull LifecycleOwner source, @NonNull Event event) {
        mInfo.invokeCallbacks(source, event, mWrapped);
    }
}

getInfo —> createInfo(mWrapped.getClass):

private CallbackInfo createInfo(Class<?> klass, @Nullable Method[] declaredMethods) {
    Class<?> superclass = klass.getSuperclass();
    Map<MethodReference, Lifecycle.Event> handlerToEvent = new HashMap<>();
    if (superclass != null) {
        CallbackInfo superInfo = getInfo(superclass);
        if (superInfo != null) {
            handlerToEvent.putAll(superInfo.mHandlerToEvent);
        }
    }

    Class<?>[] interfaces = klass.getInterfaces();
    for (Class<?> intrfc : interfaces) {
        for (Map.Entry<MethodReference, Lifecycle.Event> entry : getInfo(
                intrfc).mHandlerToEvent.entrySet()) {
            verifyAndPutHandler(handlerToEvent, entry.getKey(), entry.getValue(), klass);
        }
    }

  	//拿到表示层BasePresenter所有的方法,放在Method[]数组中
    Method[] methods = declaredMethods != null ? declaredMethods : getDeclaredMethods(klass);
    boolean hasLifecycleMethods = false;
  	//迭代遍历这个数组
    for (Method method : methods) {
      	//拿到每个方法的注解
        OnLifecycleEvent annotation = method.getAnnotation(OnLifecycleEvent.class);
      	//没写注解的,不理你
        if (annotation == null) {
            continue;
        }
        hasLifecycleMethods = true;
      	//有注解,就取方法的参数
        Class<?>[] params = method.getParameterTypes();
        int callType = CALL_TYPE_NO_ARG;
        if (params.length > 0) {
            callType = CALL_TYPE_PROVIDER;
            if (!params[0].isAssignableFrom(LifecycleOwner.class)) {
                throw new IllegalArgumentException(
                        "invalid parameter type. Must be one and instanceof LifecycleOwner");
            }
        }
        Lifecycle.Event event = annotation.value();

        if (params.length > 1) {
            callType = CALL_TYPE_PROVIDER_WITH_EVENT;
            if (!params[1].isAssignableFrom(Lifecycle.Event.class)) {
                throw new IllegalArgumentException(
                        "invalid parameter type. second arg must be an event");
            }
            if (event != Lifecycle.Event.ON_ANY) {
                throw new IllegalArgumentException(
                        "Second arg is supported only for ON_ANY value");
            }
        }
        if (params.length > 2) {
            throw new IllegalArgumentException("cannot have more than 2 params");
        }
        MethodReference methodReference = new MethodReference(callType, method);
        verifyAndPutHandler(handlerToEvent, methodReference, event, klass);
    }
    CallbackInfo info = new CallbackInfo(handlerToEvent);
    mCallbackMap.put(klass, info);
    mHasLifecycleMethods.put(klass, hasLifecycleMethods);
    return info;
}

在拿到mInfo后,就调用mInfo.invokeCallbacks(source, event, mWrapped):

void invokeCallbacks(LifecycleOwner source, Lifecycle.Event event, Object target) {
    invokeMethodsForEvent(mEventToHandlers.get(event), source, event, target);
    invokeMethodsForEvent(mEventToHandlers.get(Lifecycle.Event.ON_ANY), source, event,
            target);
}

private static void invokeMethodsForEvent(List<MethodReference> handlers,
                LifecycleOwner source, Lifecycle.Event event, Object mWrapped) {
            if (handlers != null) {
                for (int i = handlers.size() - 1; i >= 0; i--) {
                  	//根据参数的个数,反射执行注解方法
                    handlers.get(i).invokeCallback(source, event, mWrapped);
                }
            }
        }

void invokeCallback(LifecycleOwner source, Lifecycle.Event event, Object target) {
            //noinspection TryWithIdenticalCatches
            try {
                switch (mCallType) {
                    case CALL_TYPE_NO_ARG:
                        mMethod.invoke(target);
                        break;
                    case CALL_TYPE_PROVIDER:
                        mMethod.invoke(target, source);
                        break;
                    case CALL_TYPE_PROVIDER_WITH_EVENT:
                        mMethod.invoke(target, source, event);
                        break;
                }
            } catch (InvocationTargetException e) {
                throw new RuntimeException("Failed to call observer method", e.getCause());
            } catch (IllegalAccessException e) {
                throw new RuntimeException(e);
            }
        }

3.总结

LifeCycle提供了两个类LifecycleObserver、LifecycleOwner分别充当观察者、被观察者,通过观察者模式,完成对页面生命周期的监听。

作为被观察者(以Activity为例),ComponentActivity已经实现了LifecycleOwner接口,因为我们只需要负责观察者部分的代码即可。

addObserver就是对各对象、状态的封装保存。将观察者Observer、初始化状态封装为ObserverWithState对象,并以键值对(K:observer对象 V:Entry<Observer,ObserverWithState对象>)的形式将其保存到HashMap中。

被观察者Activity、Fragment等它们自身都实现了LifecycleOwner接口。有一个显眼动作,和Glide一样,添加了一个无UI的空Fragment,通过监听这个Fragment来搞定生命周期的监听问题!在这个空Fragment的各个生命周期函数中都执行了dispatch方法用来分发事件。dispatch方法接收的参数就是这个无UI的ReportFragment所处的状态(ON_CREATE、ON_START、ON_RESUME等)。当页面处于某个状态,Activity、Fragment也会到达响应的状态,它们的生命周期也会相应的执行onCreate、onDestory等。拿到被观察者的状态后,就sync同步观察者的状态(向前推、向后推),为的就是让观察者、被观察者保持一致。在sync的向前/后推的过程中,就用到了最初封装保存在HashMap中的对象、状态了。①先push当前状态,以做备份保存 ②执行状态分发 ③最后pop状态,恢复、防异常

携带状态、做状态分发的过程:获取下一个状态的最新值,和从ObserverWithState取出的状态值比较取小,修改并更新状态值。修改状态时,会拿到观察者所有的方法,并放到Method数组中。迭代遍历这个Method数组,拿到每个方法的注解(没写注解的就不鸟它),并拿到所有的参数。根据参数的个数,反射执行注解方法。这样一来,被观察者有点风吹草动,观察者就能立马响应并作出应变!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值