Jetpack ---- Lifecycle源码解析(4)响应的观察者们

转载自 青蛙要fly,略有删减, 注意原作者分析的代码不是最新的,但是变化不大,我更换了原作者的源码

看源码最好还是自己先去android官网的该模块看一下,如果大家英语不太好,可以去看我的这篇博客 Jetpack ---- Lifecycle入门,如果哪里不太对,可以指正。

如果看完这系列文章对lifecycle还有疑惑可以在阅读一下一下几篇博客,不过最主要的还是自己看完之后结合源码自己思考一下: 其实我看完原作者的博客之后,也是自己回过头来有看了一遍下面的博客,才对于Lifecycling、ProcessLifecycleOwner、LifecycleDispatcher有了更清晰的认识。
【AAC系列二】深入理解架构组件的基石:生命周期
3. Jetpack原始解析—使用生命周期管理生命周期
剖析Lifecycle源码

正文

在上一篇 Jetpack ---- Lifecycle源码解析(3)注册监听 & 发送事件 中我们我们可以看到:最后通过真正的观察者进行方法调用进行替换通知:

mLifecycleObserver.onStateChanged(owner, event);

但是我们再平常使用的时候,貌似是这样的:

class LifeObserver implements LifecycleObserver {

    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    public void CCCC(LifecycleOwner owner) {
        
    }
}

都没有这个onStateChanged方法,那这又是为什么呢?

实际上这个mLifecycleObserver并不是我们预期的Observer,而是中间适配器观察者,它先接受到了通知,然后内部在调用我们自己写的Observer,进行发送通知

简单来说就是ObserverWithState.dispatchEvent->包含onStateChanged(所有者,事件)方法的适配器观察者AdapterObserver(如果我们替换的Observer包含onStateChanged方法,如GenericLifecycleObserver,则直接没有中间这个适配器观察者)->我们的观察者

我们前面说过,我们的观察者对象被通过addObserver方法被封装到了,加入到ObserverWithState对象里面:

 static class ObserverWithState {
    State mState;
    LifecycleEventObserver mLifecycleObserver;

    ObserverWithState(LifecycleObserver observer, State initialState) {
    	//我们可以看到我们的传入的Observer被getCallback转成了其他的Observer(或者适配器):mLifecycleObserver
        mLifecycleObserver = Lifecycling.lifecycleEventObserver(observer);
        mState = initialState;
    }

    void dispatchEvent(LifecycleOwner owner, Event event) {
        State newState = getStateAfter(event);
        mState = min(mState, newState);
        //可以看到最后的回调的时候是调用mLifecycleObserver的onStateChanged方法
        mLifecycleObserver.onStateChanged(owner, event);
        mState = newState;
    }
}

响应的观察者们

我们来具体看下,我们的观察者到底被转换成什么样的观察者:

Lifecycling

static LifecycleEventObserver lifecycleEventObserver(Object object) {
    boolean isLifecycleEventObserver = object instanceof LifecycleEventObserver;
    boolean isFullLifecycleObserver = object instanceof FullLifecycleObserver;
    '1. FullLifecycleObserver观察者也是LifecycleEventObserver观察者,返回FullLifecycleObserverAdapter适配器类'
    if (isLifecycleEventObserver && isFullLifecycleObserver) {
        return new FullLifecycleObserverAdapter((FullLifecycleObserver) object,
                (LifecycleEventObserver) object);
    }
    '1. FullLifecycleObserver观察者,返回FullLifecycleObserverAdapter适配器类'
    if (isFullLifecycleObserver) {
        return new FullLifecycleObserverAdapter((FullLifecycleObserver) object, null);
    }
	'2. LifecycleEventObserver观察者,同时直接返回该类'
    if (isLifecycleEventObserver) {
        return (LifecycleEventObserver) object;
    }

    final Class<?> klass = object.getClass();
    '把传入的Observer通过getObserverConstructorType方法传入判断,是否有相应的生成的辅助类'
    int type = getObserverConstructorType(klass);
    '如果有相应生成的辅助类'
    if (type == GENERATED_CALLBACK) {
        List<Constructor<? extends GeneratedAdapter>> constructors =
                sClassToAdapters.get(klass);
        //'只有一个构造器'
        if (constructors.size() == 1) {
         	'3. GeneratedAdapter适配器类'
            GeneratedAdapter generatedAdapter = createGeneratedAdapter(
                    constructors.get(0), object);
            '3.把上面的类再封装为SingleGeneratedAdapterObserver适配器类,(内部有一个GeneratedAdapter)'    
            return new SingleGeneratedAdapterObserver(generatedAdapter);
        }
        GeneratedAdapter[] adapters = new GeneratedAdapter[constructors.size()];
        //多个构造器
        for (int i = 0; i < constructors.size(); i++) {
            '4.生成多个GeneratedAdapter适配器类'
			adapters[i] = createGeneratedAdapter(constructors.get(i), object);
        }
        '4. CompositeGeneratedAdaptersObserver类(内部有GeneratedAdapter队列)' 
        return new CompositeGeneratedAdaptersObserver(adapters);
    }
    '5. ReflectiveGenericLifecycleObserver类' 
    return new ReflectiveGenericLifecycleObserver(object);
}

所以我们可以看到现在有以下图片这些观察者:
在这里插入图片描述

使用FullLifecycleObserver

interface FullLifecycleObserver extends LifecycleObserver {

    void onCreate(LifecycleOwner owner);

    void onStart(LifecycleOwner owner);

    void onResume(LifecycleOwner owner);

    void onPause(LifecycleOwner owner);

    void onStop(LifecycleOwner owner);

    void onDestroy(LifecycleOwner owner);
}

我们可以看到该接口不是public类型,所以我们不能直接外部编写实现类,但是我们可以依赖:

implementation "android.arch.lifecycle:common-java8:1.1.1"

这样我们就可以使用DefaultLifecycleObserver接口类:

public interface DefaultLifecycleObserver extends FullLifecycleObserver {

}

我们可以看到是public的。

DefaultLifecycleObserver observer = new DefaultLifecycleObserver() {
    @Override
    public void onCreate(@NonNull LifecycleOwner owner) {

    }

    @Override
    public void onStart(@NonNull LifecycleOwner owner) {

    }

    @Override
    public void onResume(@NonNull LifecycleOwner owner) {

    }

    @Override
    public void onPause(@NonNull LifecycleOwner owner) {

    }

    @Override
    public void onStop(@NonNull LifecycleOwner owner) {

    }

    @Override
    public void onDestroy(@NonNull LifecycleOwner owner) {

    }
};

同时发生的时候,通过FullLifecycleObserverAdapter转换器观察者来进行:

class FullLifecycleObserverAdapter implements LifecycleEventObserver {

    private final FullLifecycleObserver mFullLifecycleObserver;
    private final LifecycleEventObserver mLifecycleEventObserver;

    FullLifecycleObserverAdapter(FullLifecycleObserver fullLifecycleObserver,
            LifecycleEventObserver lifecycleEventObserver) {
        mFullLifecycleObserver = fullLifecycleObserver;
        mLifecycleEventObserver = lifecycleEventObserver;
    }

    @Override
    public void onStateChanged(@NonNull LifecycleOwner source, @NonNull Lifecycle.Event event) {
        switch (event) {
            case ON_CREATE:
                mFullLifecycleObserver.onCreate(source);
                break;
            case ON_START:
                mFullLifecycleObserver.onStart(source);
                break;
            case ON_RESUME:
                mFullLifecycleObserver.onResume(source);
                break;
            case ON_PAUSE:
                mFullLifecycleObserver.onPause(source);
                break;
            case ON_STOP:
                mFullLifecycleObserver.onStop(source);
                break;
            case ON_DESTROY:
                mFullLifecycleObserver.onDestroy(source);
                break;
            case ON_ANY:
                throw new IllegalArgumentException("ON_ANY must not been send by anybody");
        }
        if (mLifecycleEventObserver != null) {
            mLifecycleEventObserver.onStateChanged(source, event);
        }
    }
}

使用GenericLifecycleObserver(现在已废弃)

public interface GenericLifecycleObserver extends LifecycleObserver {

    void onStateChanged(LifecycleOwner source, Lifecycle.Event event);
    
}

我们可以直接使用:

class AObserver implements GenericLifecycleObserver{

    @Override
    public void onStateChanged(LifecycleOwner source, Lifecycle.Event event) {
        
    }
}

我们可以AdapterObserver看到都是调用onStateChanged方法,然后间接调用我们写的具体的Observer相关方法,而GenericLifecycleObserver内部正好就是onStateChanged,所以就不需要AdapterObserver额外的适配器观察者,所以就直接返回了该Observer了

使用普通的LifecycleObserver

先说过搞笑的事情,就是很多文章都会说:

开头说加入依赖 annotationProcessor "android.arch.lifecycle:compiler:1.1.1"

后面说Lifecycle你写了XXXLifecycleObserver后,编译后会自动生成XXXLifeObserver_LifecycleAdapter文件。

然后我忘记帖子了上面的引用,找这个辅助文件怎么找都找不到,然后相关关联通知又能够顺利成功成功,搞得我一脸懵逼,后面只能去看源码,才知道了原因:有引用,就会生成辅助文件,没有依赖就会自动通过反射调用相关方法,去调用

(生成辅助文件)使用单个GeneratedAdapterObserver / CompositeGeneratedAdaptersObserver

public class SingleGeneratedAdapterObserver implements GenericLifecycleObserver {

    private final GeneratedAdapter mGeneratedAdapter;

    SingleGeneratedAdapterObserver(GeneratedAdapter generatedAdapter) {
        mGeneratedAdapter = generatedAdapter;
    }

    @Override
    public void onStateChanged(LifecycleOwner source, Lifecycle.Event event) {
        '//调用了GeneratedAdapter的callMethods方法'
        mGeneratedAdapter.callMethods(source, event, false, null);
        mGeneratedAdapter.callMethods(source, event, true, null);
    }
}

这是我们自己写的Observer类:

class DemoLifeObserver implements LifecycleObserver {

    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    public void CCCC(LifecycleOwner owner) {

    }

    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    public void AAAA(LifecycleOwner owner) {

    }

    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    public void DDDD(LifecycleOwner owner) {

    }

    @OnLifecycleEvent(Lifecycle.Event.ON_ANY)
    public void EEEE(LifecycleOwner owner,Lifecycle.Event event) {

    }
}

我们生成的辅助文件(也就是GeneratedAdapter类):

public class DemoLifeObserver_LifecycleAdapter implements GeneratedAdapter {
  final DemoLifeObserver mReceiver;

  DemoLifeObserver_LifecycleAdapter(DemoLifeObserver receiver) {
    this.mReceiver = receiver;
  }
    
    
  //'调用了callMethods方法:'
  @Override
  public void callMethods(LifecycleOwner owner, Lifecycle.Event event, boolean onAny,
      MethodCallsLogger logger) {
    boolean hasLogger = logger != null;
    if (onAny) {
      if (!hasLogger || logger.approveCall("EEEE", 4)) {
        '//调用了我们具体的观察者的方法'
        mReceiver.EEEE(owner,event);
      }
      return;
    }
    if (event == Lifecycle.Event.ON_CREATE) {
      if (!hasLogger || logger.approveCall("CCCC", 2)) {
      '//调用了我们具体的观察者的方法'
        mReceiver.CCCC(owner);
      }
      if (!hasLogger || logger.approveCall("AAAA", 2)) {
      '//调用了我们具体的观察者的方法'
        mReceiver.AAAA(owner);
      }
      return;
    }
    if (event == Lifecycle.Event.ON_START) {
      if (!hasLogger || logger.approveCall("DDDD", 2)) {
      '//调用了我们具体的观察者的方法'
        mReceiver.DDDD(owner);
      }
      return;
    }
  }
}

步骤

首先使用DemoLifeObserver,然后点击make project 如下:
在这里插入图片描述
在这里插入图片描述
然后即可在如下目录下找到自动生成的类:
在这里插入图片描述

(通过反射来调用)使用ReflectiveGenericLifecycleObserver

class ReflectiveGenericLifecycleObserver implements GenericLifecycleObserver {
    private final Object mWrapped;
    private final CallbackInfo mInfo;

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

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

我们看到这个Observer自带了onStateChanged方法,所以肯定不需要ObserverAdapter适配做中转了,直接返回这个对象即可。

然后具体跟下去,我们来看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);
    }
}        

通过反射调用的参数我们也可以知道,我们的参数可以写多个:

@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
public void AAAA(LifecycleOwner owner) {

}

@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
public void AAAA(LifecycleOwner source, Lifecycle.Event event) {

}

@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
public void AAAA(LifecycleOwner source, Lifecycle.Event event, Object target) {
        //'这个Object target参数也就是你自己写的并且通过addObserver传入的Observer'
}

结语

该文章介绍了我们预期不同的观察者后,内部是怎么转换处理,以及最后的通知我们的上层。

PS:但是这里我觉得有一点命名的误区:
都是中间的适配器观察者:SingleGeneratedAdapterObserver,FullLifecycleObserverAdapter,CompositeGeneratedAdaptersObserver。
大家看到没有,FullLife的居然叫ObserverAdapter,理论上我觉得应该是FullLifecycleAdapterObserver,哈哈,因为它也是一个观察者。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值