-
// your code
-
}
-
}
-
If you use Java 7 Language, Lifecycle events are observed using annotations.
-
Once Java 8 Language becomes mainstream on Android, annotations will be deprecated, so between
-
{@link DefaultLifecycleObserver} and annotations,
-
you must always prefer {@code DefaultLifecycleObserver}.
-
class TestObserver implements LifecycleObserver {
-
{@literal @}OnLifecycleEvent(ON_STOP)
-
void onStopped() {}
-
}
-
-
Observer methods can receive zero or one argument.
-
If used, the first argument must be of type {@link LifecycleOwner}.
-
Methods annotated with {@link Event#ON_ANY} can receive the second argument, which must be
-
of type {@link Event}.
-
class TestObserver implements LifecycleObserver {
-
{@literal @}OnLifecycleEvent(ON_CREATE)
-
void onCreated(LifecycleOwner source) {}
-
{@literal @}OnLifecycleEvent(ON_ANY)
-
void onAny(LifecycleOwner source, Event event) {}
-
}
-
These additional parameters are provided to allow you to conveniently observe multiple providers
-
and events without tracking them manually.
*/
public abstract class Lifecycle {
}
意思就是一旦Java 8成为Android的主流,注解将被弃用,所以介于DefaultLifecycleObserver和注解两者之间,更推荐使用 DefaultLifecycleObserver 。
使用方式如下
implementation “androidx.lifecycle:lifecycle-common-java8:$lifecycle_version”
这个库里其实就一个 DefaultLifecycleObserver.java
接口类。之后我们需要 LifecycleObserver
的时候,一般实现 DefaultLifecycleObserver
接口即可(不用再去直接实现 LifecycleObserver 接口),使用方式变成了下面这样:
class NormalActivity : Activity(), LifecycleOwner {
private var lifecycleRegistry: LifecycleRegistry = LifecycleRegistry(this)
override fun getLifecycle(): Lifecycle {
return lifecycleRegistry
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_normal)
lifecycle.addObserver(object : DefaultLifecycleObserver {
//下面的方法视自身情况选择实现
override fun onCreate(owner: LifecycleOwner) {
}
override fun onStart(owner: LifecycleOwner) {
}
override fun onResume(owner: LifecycleOwner) {
}
override fun onPause(owner: LifecycleOwner) {
}
override fun onStop(owner: LifecycleOwner) {
}
override fun onDestroy(owner: LifecycleOwner) {
}
})
}
}
可以看到,这里我们直接在覆写我们需要的生命周期对应回调方法中写入我们的逻辑代码即可。更加简洁。
LifecycleObserver 之间的转换
我们在使用 LifecycleObserver
时,框架内部会将其转换为GenericLifecycleObserver
或其子类。 其转换行为在类 androidx.lifecycle.Lifecycling#getCallback
中。至于这个方法何时触发,我们后续会分析。
现在先看下这个转换过程
@NonNull
static GenericLifecycleObserver getCallback(Object object) {
// 如果是 FullLifecycleObserver, 转换为 FullLifecycleObserverAdapter
if (object instanceof FullLifecycleObserver) {
return new FullLifecycleObserverAdapter((FullLifecycleObserver) object);
}
// 如果是 GenericLifecycleObserver, 不转换
if (object instanceof GenericLifecycleObserver) {
return (GenericLifecycleObserver) object;
}
final Class<?> klass = object.getClass();
// 获取转换type, GENERATED_CALLBACK 为使用代码生成,REFLECTIVE_CALLBACK 为使用反射调用
int type = getObserverConstructorType(klass);
if (type == GENERATED_CALLBACK) {
// 采用代码生成
List<Constructor<? extends GeneratedAdapter>> constructors =
sClassToAdapters.get(klass);
// 一个构造函数
if (constructors.size() == 1) {
GeneratedAdapter generatedAdapter = createGeneratedAdapter(
constructors.get(0), object);
return new SingleGeneratedAdapterObserver(generatedAdapter);
}
// 多个构造函数
GeneratedAdapter[] adapters = new GeneratedAdapter[constructors.size()];
for (int i = 0; i < constructors.size(); i++) {
adapters[i] = createGeneratedAdapter(constructors.get(i), object);
}
return new CompositeGeneratedAdaptersObserver(adapters);
}
// 默认采用反射调用
return new ReflectiveGenericLifecycleObserver(object);
}
这个方法的本质,其实就是根据传进来的一个LifecycleObserver
对象,构造出来一个 GenericLifecycleObserver
对象(目前有四个子类:FullLifecycleObserverAdapter
、SingleGeneratedAdapterObserver
、CompositeGeneratedAdaptersObserver
、ReflectiveGenericLifecycleObserver
),而最终构造出来的对象,就包含了我们创建的 LifecycleObserver
的所有信息,包括各种回调方法等。
当我们通过注解的方式来自定义LifecycleObserver
的时候,按照传统方式,必定要通过反射来对注解进行解析,这样就会对性能造成影响。那么如何优化呢?
-
通过缓存,来避免每次都通过反射获取构造器。
-
通过注解处理器,在编译时对那些被
@OnLifecycleEvent
注解标注的普通方法,进行预处理,生成以“类名_LifecycleAdapter”命名的类,将各种回调方法直接进行逻辑转换,避免反射,进而来提高性能。
我们先看下仅用反射的情况下google是如何优化的
不引入注解处理器时,Lifecycling.getCallback(observer)
返回的是ReflectiveGenericLifecycleObserver
package androidx.lifecycle;
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);
}
}
这里我们主要关注回调信息 CallbackInfo
的获取方式的代码:
mInfo = ClassesInfoCache.sInstance.getInfo(mWrapped.getClass());
因为反射的代价是比较大的,所以又通过 ClassesInfoCache.java
这个单例类,为 ReflectiveGenericLifecycleObserver
类要调用的各种方法的相关信息进行了缓存。
点进去看下它的 getInfo(...)
方法内部,是如何获取方法信息的。
CallbackInfo getInfo(Class klass) {
// 先读取缓存
CallbackInfo existing = mCallbackMap.get(klass);
if (existing != null) {
return existing;
}
existing = createInfo(klass, null);
return existing;
}
private CallbackInfo createInfo(Class klass, @Nullable Method[] declaredMethods) {
// 先提取父类的 CallbackInfo
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);
}
}
// 再提取接口的 CallbackInfo
Class[] interfaces = klass.getInterfaces();
for (Class intrfc : interfaces) {
for (Map.Entry<MethodReference, Lifecycle.Event> entry : getInfo(
intrfc).mHandlerToEvent.entrySet()) {
// verifyAndPutHandler 的作用是实现了接口或者覆写了父类的方法,但是添加了不同的注解事件。
verifyAndPutHandler(handlerToEvent, entry.getKey(), entry.getValue(), klass);
}
}
// 最后处理类自身的注解
Method[] methods = declaredMethods != null ? declaredMethods : getDeclaredMethods(klass);
boolean hasLifecycleMethods = false;
// 遍历方法,寻找被 OnLifecycleEvent 注解的方法
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;
}
这里,就能看到对注解进行处理的代码了。
我们再看下另一种优化(使用注解处理器)
首先需要在项目模块中引入
annotationProcessor “androidx.lifecycle:lifecycle-compiler:2.0.0”
复制代码
引入这个之后,会自动生成xxx_LifecycleAdapter
的文件,路径为
/app/build/generated/source/apt/debug/package_name/LifeObserveCustomName_LifecycleAdapter.java
我们先看下效果:
public class LifecyclePresenter implements LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
void onCreateInPresenter(@NotNull LifecycleOwner owner){
System.out.println(“on create”);
};
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
void onDestroyInPresenter(@NotNull LifecycleOwner owner){
System.out.println(“on destory”);
};
@OnLifecycleEvent(Lifecycle.Event.ON_ANY)
void onLifecycleChangedInPresenter(@NotNull LifecycleOwner owner,
@NotNull Lifecycle.Event event){
System.out.println(“on any”);
}
}
上面的代码在引入注解处理器后,编译项目时就会在build目录下自动生成LifecyclePresenter_LifecycleAdapter
public class LifecyclePresenter_LifecycleAdapter implements GeneratedAdapter {
final LifecyclePresenter mReceiver;
LifecyclePresenter_LifecycleAdapter(LifecyclePresenter receiver) {
this.mReceiver = receiver;
}
@Override
public void callMethods(LifecycleOwner owner, Lifecycle.Event event, boolean onAny,
MethodCallsLogger logger) {
boolean hasLogger = logger != null;
if (onAny) {
if (!hasLogger || logger.approveCall(“onLifecycleChangedInPresenter”, 4)) {
mReceiver.onLifecycleChangedInPresenter(owner,event);
}
return;
}
if (event == Lifecycle.Event.ON_CREATE) {
if (!hasLogger || logger.approveCall(“onCreateInPresenter”, 2)) {
mReceiver.onCreateInPresenter(owner);
}
return;
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
题外话
我们见过很多技术leader在面试的时候,遇到处于迷茫期的大龄程序员,比面试官年龄都大。这些人有一些共同特征:可能工作了7、8年,还是每天重复给业务部门写代码,工作内容的重复性比较高,没有什么技术含量的工作。问到这些人的职业规划时,他们也没有太多想法。
其实30岁到40岁是一个人职业发展的黄金阶段,一定要在业务范围内的扩张,技术广度和深度提升上有自己的计划,才有助于在职业发展上有持续的发展路径,而不至于停滞不前。
不断奔跑,你就知道学习的意义所在!
注意:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题(含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)**
[外链图片转存中…(img-o80rPdxl-1712683985266)]
题外话
我们见过很多技术leader在面试的时候,遇到处于迷茫期的大龄程序员,比面试官年龄都大。这些人有一些共同特征:可能工作了7、8年,还是每天重复给业务部门写代码,工作内容的重复性比较高,没有什么技术含量的工作。问到这些人的职业规划时,他们也没有太多想法。
其实30岁到40岁是一个人职业发展的黄金阶段,一定要在业务范围内的扩张,技术广度和深度提升上有自己的计划,才有助于在职业发展上有持续的发展路径,而不至于停滞不前。
不断奔跑,你就知道学习的意义所在!
注意:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题(含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)
[外链图片转存中…(img-GU12F5YR-1712683985266)]
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-hLcHRi7e-1712683985267)]