- 博客(17)
- 资源 (1)
- 收藏
- 关注
原创 对于代码中有大量的 if/else 有什么优化思路?
原始网页直通车总结一下大佬们提出的方法:在 kotlin 中可以使用 when 关键字;val result = when { x in 1..10 -> x y.isOdd() -> "y is odd" s.contains("hello") -> s v is ViewGroup -> "child count: ${v.getChildCount()}" else -> "..."}when (x) { 1 -> prin
2020-08-23 21:15:39
402
原创 为什么属性动画移动一个控件后,目标位置仍然能响应用户事件?
原始网页直通车这个问题,换句话描述就是:一个 view 在应用了属性动画后,该 view 在新的位置仍然能正确的收到分派的事件。我们知道, view 调用 translationXX 方法后,虽然它在屏幕上显示的位置变了,但它的 [left, top, right, bottom] 是不变的,那 ViewGroup 是如何找到这个“偷跑” view 并正确分派事件的呢?正常情况下,当手指按下时,触摸事件会经过 ViewGroup 中的 dispatchTouchEvent 方法筛选符合条件(手指在边
2020-08-15 20:14:08
421
原创 装饰者模式及其在 Android Context 中的应用
一、装饰者模式1.1 定义装饰者模式又名包装(Wrapper)模式。它可以在不改变原类文件以及不使用继承的情况下,动态地将责任附加到对象上,从而实现动态拓展对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。1.2 遵循的设计原则多用组合,少用继承继承是编译时静态决定的,所有的子类都会继承到相同的行为。如果能利用组合的做法扩展对象的行为,就可以在运行时动态地进行扩展。开放-关闭原则:类应该对扩展开放,对修改关闭1.3 和继承相比拓展性好,更加灵活降低了类与类
2020-08-09 17:00:05
443
原创 聊一下 Gradle 相关,BuildConfig 这个类是如何生成的?
原始网页直通车每个项目中, Gradle 都会帮助我们生成一个 BuildConfig ,那么:这个类有何用处?是在项目的编译期间,哪个环节、如何生成的?BuildConfig 的用处项目编译成功后,会在每一个 module 下的 build/generated/source/buildConfig/debug(release)/包名 下生成一个 BuildConfig 文件。内容如下:public final class BuildConfig { public static f
2020-08-02 21:26:52
2503
原创 getMeasuredWidth, getWidth 有什么区别?
原始网页直通车getMeasuredWidth 返回的是测量后的宽度,这个宽度是在 setMeasuredDimension 方法被调用后刷新的。( measure 方法最终会调用 setMeasuredDimension 方法)getWidth 返回的是 layout 出来的宽度,在 View 代码中返回的是 mRight - mLeft ,这两个变量是在 setFrame 方法被调用后赋值的。( layout 方法中会调用 setFrame )也就是说, getMeasuredWidth 返
2020-07-26 19:32:06
793
原创 View 中的 getContext 一定返回的是 Activity 对象吗?
答案是不一定。如果这个 View 是我们构造出来的,那肯定它的 getContext() 返回的是我们构造它的时候传入的 Context 类型。如果是 XML 里面的 View 呢,会怎样?先看结论:直接继承 Activity 构造出来的 View , View.getContext() 返回的是当前 Activity 。但是:当 View 的 Activity 是继承自 AppCompatActivity ,并且在 Android 5.0 以下版本的手机上时, View.getContext()
2020-07-18 14:07:54
667
转载 详细描述下自定义 View 测量时的 MesureSpec.UNSPECIFIED
原始网页直通车UNSPECIFIEDUNSPECIFIED :未指明的,未指定的。在这个模式下父控件不会干涉 子View 想要多大的尺寸。这个模式什么时候会在 onMeasure 里遇到呢?这其实取决于父容器。拿最常用的 RecyclerView 为例,在 Item 进行 measure 时,如果列表可滚动,并且 Item 的宽或高设置了 WRAP_CONTENT 的话,那么接下来, ItemView 的 onMeasure 方法就会收到 MesureSpec.UNSPECIFIED 。打开
2020-07-12 17:12:25
857
1
原创 对于 SharedPreferences 你觉得有什么优缺点?
原始网页直通车简介一个轻量级的存储类,以键值对的 XML 文件形式将数据存储在本地,程序卸载后也会一并清除,不会残留信息。要想使用 SharedPreferences 来存储数据,首先需要获取到 SharedPreferences 对象。 Android 中主要提供了 3 种方法用于得到 SharedPreferences 对象。Context 类中的 getSharedPreferences() 方法此方法接收两个参数,第一个参数用于指定 SharedPreferences 文件的名称,如
2020-07-05 15:39:43
770
原创 自定义 ViewGroup 的时候,关于 LayoutParams 有哪些注意事项?
原始网页直通车LayoutParams子View 通过 LayoutParams 告诉 ViewGroup 应该如何放置自己,主要用来协助 ViewGroup 进行布局。在自定义 ViewGroup 的过程中,如果需要定义 LayoutParams 的话,首先要创建一个类(通常是静态内部类),并继承自 ViewGroup.LayoutParams 或其子类。在 ViewGroup 中,我们需要重写几个方法:generateDefaultLayoutParams()generateLayout
2020-06-26 10:58:18
374
原创 Gradle Transform API 和 Annotation Processor 简要介绍
原始网页直通车Transform对字节码进行操作,作用在 java 代码编译生成 class 文件之后, class 打包生成 apk 之前,在这段时间内,遍历修改 class 文件。Transform 可以修改所有的 class 文件,包括引入的三方库。使用Transform的项目:CC-register、部分组件化框架,根据参与打包的组件插入初始化代码的操作…Annotation在对 java 代码进行编译时,根据元注解获取到的 java 代码信息,生成相应的辅助类。源码级别的操
2020-06-21 15:31:13
682
原创 谈谈你对 Binder 的理解
原始网页直通车文章目录Binder 是什么?为什么选择 Binder ?Binder 通信流程Android 中使用 Binder 的场景参考链接Binder 是什么?Binder :黏合剂,可以理解为黏合了两个不同的进程。为什么选择 Binder ?我们知道 Android 虚拟机是基于 Linux 实现的,而 Linux 的 IPC 通信主要有管道、消息队列、信号量、socket、共享内存等。我们在开发 APP 时都会要求性能好,数据安全且传输快,所以我们首要从性能和安全性这两方面
2020-06-14 20:00:53
321
原创 View的onAttachedToWindow, onDetachedFromWindow的调用时机,使用场景是什么?
原始网页直通车调用时机Attached附加的意思,当 View 附加到 Window 的时候,就会回调 onAttachedToWindow 。Detached分离,拆卸的意思,与 Attached 刚好相反,也就是当 View 与 Window 分离的时候会回调 onDetachedFromWindow 。在 Android 中, Window 是个抽象的概念, Android 中 Window 的具体实现类是 PhoneWindow , Activity 和 Dialog 中的 Wind
2020-06-07 19:24:50
3816
原创 如何捕获一个Activity页面上所有的点击行为?
原始网页直通车方案一:Activity 的根布局重写 dispatchTouchEvent 方法,监听 ACTION_DOWN 和 ACTION_UP ,然后判断距离差,小于一定距离(时间)则视为点击。优点:方便快捷缺点:无法监听到已显示的Dialog方案二:添加一个透明的 全屏View 到 WindowManager 中,用来监听和转发 TouchEvent ,并且重写 目标Activity 的 onWindowFocusChanged 方法,每当这个方法被回调时,证明有可能是 Dialo
2020-06-03 21:49:14
540
原创 volatile, synchronize, cas, happens before, lost wake up
volatileCPU在执行指令时,为了提高执行效率,会把内存中的数据拷贝一份到高速缓存中,所以程序在访问或修改变量的时候,操作的并不是内存中的数据,而是高速缓存中的数据。这样的话,在 多核心CPU + 多线程 上,可能会出现 新写入的数据 未能立即更新到 内存 中,这时候,如果有其他线程刚好又访问到这个变量,那么它读取到的数据,还是旧数据。使用 volatile 关键字修饰的变量,在程序修改它的数据之后,其他线程总是能拿到最新的值。volatile 在双重检查锁形式的单例中,不仅起到内存
2020-05-31 19:25:22
232
原创 Android关于内存泄漏有哪些注意点?
Android关于内存泄漏有哪些注意点?原始网页直通车内存泄漏的根本原因是一个长生命周期对象持有一个短生命周期对象,造成短生命周期对象没有办法被回收。常见情形:内部类形式使用 Handler 并发送了延迟消息时,当退出Activity 时会造成 Activity 内存泄漏。 AsyncTask 同理。解决方案:Activity 销毁时移除所有与 当前Handler 相关联的消息。将使用的 Handler内部类 定义成静态内部类。但是静态内部类引用不到外部类的非静态属性和方法,可以
2020-05-24 18:38:47
920
2
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人