1、8年安卓开发经验,熟练掌握Android应用开发,并能独立负责应用程序设计、开发、维护
2、Java基础扎实,了解泛型、反射、自定义注解及其原理,多次使用常见设计模式重构代码
3、熟练掌握JVM原理、多线程(synchronized、volatile、原子操作CAS、线程锁、AQS)、反射、动态代理
4、精通自定义View,熟悉View的绘制流程,能利用事件分发原理解决UI交互问题
5、熟悉Handler、WMS、图形显示,有阅读Framwork源码来解决实际问题经验
6、对内存优化、性能优化、屏幕适配有调优经验
7、熟悉属性动画的结构、架构思想和运行原理
8、熟练掌握Rxjava/OKHttp/Retrofit/Glide等第三方框架的使用和原理
9、熟练掌握MVC/MVP/MVVM/MVI,并有与其他框架搭建自己的构架的经验
10、掌握Android的Jetpack组件,熟悉lifecycle、databinding、viewmodel、livedata等
12、熟悉Kotlin、Flow,熟悉全新UI库Compose并研究过原理
洋光在线内部学员学习的APP,包括课程信息、班级信息、直播、录播、课程课件信息以及作业提交等
一. MVP+Rxjava+Hilt搭建APP
采用MVP架构讲Activity的业务逻辑可以抽离到Presenter中,让Activity只负责UI逻辑,Model负责数据相关部分,整
个代码层次分明、职责明确和耦合度低,便于复用和扩展以及测试。
使用泛型和Hilt的注解,通过依赖注入的方式完成Presenter和Model的创建,避免View和Presenter、Model的直接依赖,
降低个模块的耦合。
二. 动态测量宽高
在展示标签的时候一般采用流式布局,如果标签超过了三行会展示一个折叠的按钮。得到行数一般采用先动态计算流式
布局的高度然后除以行高的方式,所以一切的关键在于动态得到流式布局的高度。
动态获取流式布局的高度采用的是ViewTreeObserver中的onGlobalLayoutListener,也就是整个视图树的布局工作结束。
在其中会发现回调被执行了两次,希望在执行第一次的时候移除监听但移除不了,后面通过阅读源码发现
view.getViewTreeObserver第一次的时候是获取的临时对象,后面被kill了,之后需要移除监听需要重新获取。 事件分发处理s三. ViewPager2联动
界面中需要展示两个ViewPager,一个ViewPager的滑动同步带动另外一个。最原先采用的是通过监听ViewPager滑动距
离,然后让另外一个ViewPager模拟滑动,采用fakeDragBy的方案,但是在实际开发中发现联动出现不一致。
第一次升级处理是通过查阅原理发现ViewPager2中使用的核心是RecyclerView,模拟滑动最终驱动的也是ReyclerView。
但ViewPager2做了相关的距离判断,导致部分情况滑动不了,所以选择直接把距离作用到RecyclerView上。
第二次升级处理是为了优化代码,官方是不断更新的,需要更加底层更适用的方式。这次运用事件分发原理,将一个
ViewPager接收到的输入事件原封不到复制分发到另外一个ViewPager,这样就会非常简单的产生同样的滑动效果。此方法非
常的简单、出错少且适应各个版本,即使以后官方代码升级都没关系。
四. 插件化换肤
通过自定义Factory2的方式,自己实现实例化View的代码并记录相关需要更换皮肤的信息,然后通过在Application中
调用registerActivityLifecycleCallback的方式给每个Activity设置好LayoutInflater的Factory2的信息,完成Hook操作。
接着构建皮肤包的Resources对象并进行resid的转换,最后记录控件的相关属性动态的更换相关的资源。此方法易引入、易
操作、无重启、无卡顿,比较适用的皮肤包技术。
这是洋光内部学员上课的辅助工具,大致为课程班级信息,作业提交等。这个app采用mvp架构结合最新的事件总线LiveDataBus以及通过Hilt进行依赖注入。使用最底层的事件分发的方式处理事件联动问题,用最简洁的方式处理问题。使用插件化换肤的方式,通过Hook Factory2的
一. MVP+Rxjava+Hilt搭建APP 采用MVP架构讲Activity的业务逻辑可以抽离到Presenter中,让Activity只负责UI逻辑,Model负责数据相关部分,整 个代码层次分明、职责明确和耦合度低,便于复用和扩展以及测试。 二. 网络模块