-
View 事件分发源码解析
1. 源码分析目标上一篇文章中对 View 事件分发的规律进行了总结,总结了 View 事件流的分发规律以及不同拦截情况下的走向。其中有些总结我们可能只知道结论,但是并不知道为什么是那样的结论,比如,在父 View 中的 onInterceptTouchEvent 中拦截 move 时,首次 move 事件过来时,子 View 的 dispatchTouchEvent 中收到了一个动作 ACTION_CANCEL,而父 View 首次并没有收到第一次 move 事件,而 Activity ...…
-
BottomSheet 设计分析与踩坑
1. BottomSheet底部弹窗是一个很常见的一个功能,取消确认面板、分享面板、评论面板等,都是底部弹出的场景,那么想实现这样一个面板,应该怎么思考去设计一个面板满足需求呢?对于开发来说,完成一个功能大致会完成这几步,首先是需求分析,然后方案调研与分析、方案设计、功能编码实现,当然最后一步复盘总结可有可无,但对于我们掌握知识来说还是很重要的!2. 需求分析对于一个需求主要也是从几个方面出发: UI:宽高、主题、背景、内部是否有多个布局或者 Fragment 交互:拖动、...…
-
应用卡顿优化
对于卡顿分析,首先需要明确分析的因素,即影响卡顿有哪些点,是 CPU 繁忙,线程锁资源导致的阻塞,IO 耗时操作,还是内存吃紧等,然后再收集卡顿时相关信息,当前设备信息,当前运行状态,堆栈信息等,最后根据这些信息,以及结合具体的业务场景得到卡顿原因。1.卡顿现象对于卡顿现象,最直观体现在应用显示上。正常一个 App 不卡顿时,应该表现出页面显示比较稳定,没有跳变,丢帧;动画平稳流畅;用户交互反应灵敏。通常条件下,人眼的识别连贯图像的速度是 24 帧/s,也就是 1000ms/24 帧,大约...…
-
SharePreferences 分析及正确使用姿势
1.Android 常见数据存储方式在 Android 中,常用数据存储方式通常有以下几类:文件存储:将数据存储在文件中。文件存储根据位置不同,可以存储在应用包下,成为内部存储;也可以存储在 storage文件夹(当然也有可能是mnt文件夹,不同的手机厂商可能不一样)上,称之为外部存储 SharedPreferences 存储:SharedPreferences 是 Android 提供的用来存储一些简单配置信息的一种机制,核心原理是:保存基于 XML 文件存储的 key-val...…
-
Android ANR
1.ANR1.1 什么是 ANR?我们知道安卓应用中 UI 渲染是在主线程中,所以对于一些点击事件,以及和用户交互相关的事件需要能够及时,否则对于用户来说就是一个很不好的体验。安卓系统中对于这类在主线程中没有及时作出反馈的问题叫作 ANR(Application Not Responding)。安卓不同组件对于 ANR 的超时限制是不同的。安卓中 ANR 的机制采用类似于『看门狗』,发送事件的同时,会发一个计时的消息,如果在计时的时间内没有完成事件,则触发 ANR。gityuan 博客中形...…
-
RxJava 内存泄漏
1. RxJava 内存泄漏原因 Disposable 基本原理:(1)这里仅看下 Observer 的执行,如在主线程执行 Observer,会走 Observable 的 observeOn 方法,然后会把 Observable 包装成 ObservableObserveOn。当被订阅者如 PublishSubject 通过 onNext 发送事件时,会调用 ObservableObserveOn 中的订阅者 ObserveOnObserver 的 onNext 方法。之后会通过 W...…
-
内存泄漏常见场景及处理方法
1.Java垃圾回收(GC)Java 是如何管理内存为了判断Java中是否有内存泄露,我们首先必须了解Java是如何管理内存的。Java的内存管理就是对象的分配和释放问题。在Java中,程序员需要通过关键字new为每个对象申请内存空间 (基本类型除外),所有的对象都在堆 (Heap)中分配空间。另外,对象的释放是由GC决定和执行的。在Java中,内存的分配是由程序完成的,而内存的释放是有GC完成的,这种收支两条线的方法确实简化了程序员的工作。但同时,它也加重了JVM的工作。这也是Java程...…
-
Android 依赖注入 DI - Dagger2
1.依赖注入 (Dependency Injection)1.1 面向接口编程public interface Drivable { void drive();}public class Bike implements Drivable { @Override public void drive() { System.out.println("骑车"); }}public class Car implements Drivable { @Over...…
-
Android 中 Text Span 分析
1.为什么需要 Span?在文本展示时,如果不需要设置样式,包括颜色,大小,对齐方式等属性时,可以利用 View 的属性来控制,但是很多时候我们希望控制颜色,字体大小,对齐方式,段落,超链接点击,甚至是可编辑等特性,这时候就需要能够对文本的一个或者多个字符进行属性控制,所以就有了 span。 span 译为“跨度”,可以理解为就是一个或者多个字符的意思。一个文本可以有多个 span,这些 span 就是用来设置文本的样式,每个 span 标识文本的一个字符或者段落级。这些 span 是附属...…
-
View性能优化(一)
1 View 机制简单介绍UI 渲染还依赖两个核心的硬件:CPU 与 GPU。UI 组件在绘制到屏幕之前,都需要经过 Rasterization(栅格化)操作,而栅格化操作又是一个非常耗时的操作。GPU(Graphic Processing Unit )也就是图形处理器,它主要用于处理图形运算,可以帮助我们加快栅格化操作。Android 图形系统的整体架构图形渲染过程当作一次绘画过程: 画笔:Skia 或者 OpenGL。我们可以用 Skia 画笔绘制 2D 图形,也可以用 OpenGL...…
-
2019个人总结
有人说 2019 年外界是『乱』的,香港事件、中美关系、猪肉大涨、经济下行、到中小型企业生存艰难,再到找工作困难等,所以看到无论是国内还是国际上,形势上都不容乐观,而对于我们自身来说,也多多少少会受到影响,不敢轻易换工作,对于很多人来说最好还是老老实实做好现在的工作,努力提升自己。2019 年对于我来说也是变化很大的一年,技术方向回到正轨、部门频繁变动、技术成长、工作变化、自由行、找到工作后的放纵、坚持运动、读书量减少、新的起点。一年其实还是很短的,这年里从上面列举的关键词中可以看出,虽然...…
-
面试总结
1.自我介绍我是 16 年研究生毕业之后才转行做编程开发,在学校学的专业是机械,研究生时在实验室做了一点 C++,使用 MFC 编写一些 PC 的桌面程序,当时也没有学明白,临毕业时想走编程方向,但是并不好找相关工作。最后去了一家公司的一个新部门,做 VR 相关开发,实际上是研究,也主要是我自己搞研究。当时虽然做安卓开发,并不是做 App 应用开发,而是做 VR SDK 研究,更偏向于底层的 NDK 开发。经过 1 年多之后,编程水平也仅仅是学到了一些皮毛,甚至连一个简单的 App 都很难...…
-
View 事件分发规律总结(超详细)
上一篇 事件分发—初体验文章中实现了一个能够滑动关闭的 Demo,主要来体验一下事件分发,这篇来对 View 的事件分发做一下规律总结,包括【单一 View】,【单一 ViewGroup(不含子 View)】,【ViewGroup + View】,【ViewGroup + ViewGroup】。1. 事件分发总览当用户点击屏幕产生一个动作,这个动作通过底层硬件来捕获,然后交给 ViewRootImpl,接着将事件传递给 DecorView,DecorView 再交给 PhoneWindow...…
-
事件分发—初体验
1.View 事件分发初体验View 事件在 Android 中也是很重要的一块,通过对事件的处理可以完成一系列的交互操作,使界面有更好的交互效果,本篇文章就来体验一下事件处理带来的效果,本文不会重点分析事件分发的过程以及原理,主要通过本文先来对事件的分发有一个初步的概念,后面的文章会单独总结事件分发的各种处理情况以及源码分析。先来看一下效果。从这个效果中分析一下需要实现的需求。2.实现思路(1) 有了需求,就根据需求来分析,找出最主要的功能,由于主要的功能就是 View 的滑动,但是滑动...…
-
并发学习之 - ReentrantLock
synchronized 和 ReentrantLock上一篇文章 并发学习之 - synchronized 中我们讲解了如何使用关键字 synchronized 来实现同步访问。从 Java 5 之后,JDK 提供了另外一种方式来实现同步访问,那就是 ReentrantLock。ReentrantLock 增加了一些高级功能,主要是这 3 项:等待可中断、可实现公平锁,以及锁可以绑定多个条件。在 JDK 6 之前,尽管 synchronized 关键字实现同步很方便,但是这种同步操作很重...…
-
并发学习之 - synchronized
上一篇文章 并发基础知识扫盲 讲了一些 java 中 并发相关的基础性的东西,这篇来了解下同步中常使用的关键字 synchronized。synchronized 关键字是随着 Java 的诞生就有的的,它对于开发者来说,使用起来非常方便,无需关心底层的复杂实现。但是在使用过程中开发者往往担心 synchronized 带来的性能问题,认为它太重了,获得锁和释放锁的确会带来性能上的消耗。在 Java SE 1.6 之后,synchronized 进行了很大的优化,引入了偏性锁和轻量级锁,来...…
-
并发基础知识扫盲
1. 进程和线程提到并发,首先需要了解下进程和线程。1.1 进程进程,可以理解为就是一个应用程序,如当我们听音乐时,开启的程序就是一个进程;当我们听着音乐,写着代码,这个时候就开启了两个程序,有两个进程在运行。此时,相当于 CPU 在同时处理两个任务,属于并发,对用户来说,两个进程就像在同时运行一样。现代的多核处理器,确实可以做到多个进程并行。一个进程开启,操作系统会为这个进程分配独立的资源,不同的进程之间相互隔离,所以进程是资源分配的基本单元,进程间的隔离,会使得进程在运行时,就像该进程...…
-
Serializable 和 Parcelable
1.序列化和反序列化序列化(Serialization)是将对象的状态信息转化为可以存储或者传输形式的过程,一般将一个对象存储到一个储存媒介,例如档案或记忆体缓冲等,在网络传输过程中,可以是字节或者 XML 等格式;而字节或者 XML 格式,可以还原成完全相等的对象,这个相反的过程又称为反序列化。2.序列化的作用通常完成序列化是由于以下三方面的需要: 永久性保存对象,保存对象的字节序列到本地文件中 通过序列化对象在网络中传递对象 ...…
-
AsyncTask 源码分析
AsyncTask 简介在 Android 中执行耗时任务时,我们一般不直接自己 new 一个 Thread,而且在 Android Studio 中也会给出提示,不建议使用传统的 Thread,那么有哪些方式呢? HandlerThread 是一个 Thread,内部使用 Handler,它与普通 Thread 的区别是通过 handler 向消息队列中添加消息,优势是可以利用 Message 做相关控制,而且 HandlerThread 不调用 quit(),线程...…
-
okhttp3 源码分析
在上一篇 Retrofit 学习第三弹—源码分析篇 分析了 Retrofit 的源码,分析到请求 Call 位置,是调用的 okhttp3 中的 OkHttpClient 来完成请求的,所以 Retrofit 是基于 okhttp3 的一个封装,通过注解来设定参数构造出 Request,然后通过 OkHttpClient 创建 Call 实例。下面就来分析下 okhttp3 的流程。1. okhttp 使用回顾简单看下 okhttp Get 的请求过程:public static Stri...…