自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(68)
  • 资源 (2)
  • 问答 (10)
  • 收藏
  • 关注

原创 View 事件分发源码解析

1. 源码分析目标上一篇文章中对 View 事件分发的规律进行了总结,总结了 View 事件流的分发规律以及不同拦截情况下的走向。其中有些总结我们可能只知道结论,但是并不知道为什么是那样的结论,比如,在父 View 中的 onInterceptTouchEvent 中拦截 move 时,首次 move 事件过来时,子 View 的 dispatchTouchEvent 中收到了一个动作 ACTION_CANCEL,而父 View 首次并没有收到第一次 move 事件,而 Activity 中收到了第一次

2022-04-18 23:30:31 214

原创 BottomSheet 设计分析与踩坑

BottomSheet

2022-03-27 22:32:12 2832

原创 应用卡顿优化

对于卡顿分析,首先需要明确分析的因素,即影响卡顿有哪些点,是 CPU 繁忙,线程锁资源导致的阻塞,IO 耗时操作,还是内存吃紧等,然后再收集卡顿时相关信息,当前设备信息,当前运行状态,堆栈信息等,最后根据这些信息,以及结合具体的业务场景得到卡顿原因。1.卡顿现象对于卡顿现象,最直观体现在应用显示上。正常一个 App 不卡顿时,应该表现出页面显示比较稳定,没有跳变,丢帧;动画平稳流畅;用户交互反应灵敏。通常条件下,人眼的识别连贯图像的速度是 24 帧/s,也就是 1000ms/24 帧,大约为 40ms

2021-05-18 18:09:53 1150

原创 SharePreferences 分析及正确使用姿势

1.Android 常见数据存储方式在 Android 中,常用数据存储方式通常有以下几类:文件存储:将数据存储在文件中。文件存储根据位置不同,可以存储在应用包下,成为内部存储;也可以存储在 storage文件夹(当然也有可能是mnt文件夹,不同的手机厂商可能不一样)上,称之为外部存储SharedPreferences 存储:SharedPreferences 是 Android 提供的用来存储一些简单配置信息的一种机制,核心原理是:保存基于 XML 文件存储的 key-value 键值对数据。

2021-05-09 20:27:43 2851

原创 Android ANR

1.ANR1.1 什么是 ANR?我们知道安卓应用中 UI 渲染是在主线程中,所以对于一些点击事件,以及和用户交互相关的事件需要能够及时,否则对于用户来说就是一个很不好的体验。安卓系统中对于这类在主线程中没有及时作出反馈的问题叫作 ANR(Application Not Responding)。安卓不同组件对于 ANR 的超时限制是不同的。安卓中 ANR 的机制采用类似于『看门狗』,发送事件的同时,会发一个计时的消息,如果在计时的时间内没有完成事件,则触发 ANR。gityuan 博客中形容的比较

2021-04-11 22:33:31 520

原创 RxJava 内存泄漏

1. RxJava 内存泄漏原因Disposable 基本原理:(1)这里仅看下 Observer 的执行,如在主线程执行 Observer,会走 Observable 的 observeOn 方法,然后会把 Observable 包装成 ObservableObserveOn。当被订阅者如 PublishSubject 通过 onNext 发送事件时,会调用 ObservableObserveOn 中的订阅者 ObserveOnObserver 的 onNext 方法。之后会通过 Worker

2021-01-16 20:08:45 1403

原创 内存泄漏常见场景及处理方法

1.Java垃圾回收(GC)Java 是如何管理内存为了判断Java中是否有内存泄露,我们首先必须了解Java是如何管理内存的。Java的内存管理就是对象的分配和释放问题。在Java中,程序员需要通过关键字new为每个对象申请内存空间 (基本类型除外),所有的对象都在堆 (Heap)中分配空间。另外,对象的释放是由GC决定和执行的。在Java中,内存的分配是由程序完成的,而内存的释放是有GC完成的,这种收支两条线的方法确实简化了程序员的工作。但同时,它也加重了JVM的工作。这也是Java程序运行速度较

2021-01-16 20:06:29 2430

原创 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 {

2021-01-10 14:42:09 338

原创 Android 中 Text Span 分析

1.为什么需要 Span?在文本展示时,如果不需要设置样式,包括颜色,大小,对齐方式等属性时,可以利用 View 的属性来控制,但是很多时候我们希望控制颜色,字体大小,对齐方式,段落,超链接点击,甚至是可编辑等特性,这时候就需要能够对文本的一个或者多个字符进行属性控制,所以就有了 span。 span 译为“跨度”,可以理解为就是一个或者多个字符的意思。一个文本可以有多个 span,这些 span 就是用来设置文本的样式,每个 span 标识文本的一个字符或者段落级。这些 span 是附属在文本上的,通过

2020-11-04 10:59:49 2195

原创 View 性能优化(一)

1 View 机制简单介绍UI 渲染还依赖两个核心的硬件:CPU 与 GPU。UI 组件在绘制到屏幕之前,都需要经过 Rasterization(栅格化)操作,而栅格化操作又是一个非常耗时的操作。GPU(Graphic Processing Unit )也就是图形处理器,它主要用于处理图形运算,可以帮助我们加快栅格化操作。Android 图形系统的整体架构图形渲染过程当作一次绘画过程:...

2020-05-04 15:09:32 678

原创 View 事件分发规律总结(超详细)

上一篇 事件分发—初体验文章中实现了一个能够滑动关闭的 Demo,主要来体验一下事件分发,这篇来对 View 的事件分发做一下规律总结,包括【单一 View】,【单一 ViewGroup(不含子 View)】,【ViewGroup + View】,【ViewGroup + ViewGroup】。1. 事件分发总览当用户点击屏幕产生一个动作,这个动作通过底层硬件来捕获,然后交给 ViewRoot...

2019-09-15 14:56:42 327

原创 事件分发—初体验

1.View 事件分发初体验View 事件在 Android 中也是很重要的一块,通过对事件的处理可以完成一系列的交互操作,使界面有更好的交互效果,本篇文章就来体验一下事件处理带来的效果,本文不会重点分析事件分发的过程以及原理,主要通过本文先来对事件的分发有一个初步的概念,后面的文章会单独总结事件分发的各种处理情况以及源码分析。先来看一下效果。从这个效果中分析一下需要实现的需求。2.实...

2019-09-08 21:18:45 182

原创 并发学习之 - ReentrantLock

synchronized 和 ReentrantLock上一篇文章 并发学习之 - synchronized 中我们讲解了如何使用关键字 synchronized 来实现同步访问。从 Java 5 之后,JDK 提供了另外一种方式来实现同步访问,那就是 ReentrantLock。ReentrantLock 增加了一些高级功能,主要是这 3 项:等待可中断、可实现公平锁,以及锁可以绑定多个条件。...

2019-08-20 11:10:06 109

原创 并发学习之 - synchronized

上一篇文章 并发基础知识扫盲 讲了一些 java 中 并发相关的基础性的东西,这篇来了解下同步中常使用的关键字 synchronized。synchronized 关键字是随着 Java 的诞生就有的的,它对于开发者来说,使用起来非常方便,无需关心底层的复杂实现。但是在使用过程中开发者往往担心 synchronized 带来的性能问题,认为它太重了,获得锁和释放锁的确会带来性能上的消耗。在 Ja...

2019-08-04 22:32:00 103

原创 并发基础知识扫盲

1. 进程和线程提到并发,首先需要了解下进程和线程。1.1 进程进程,可以理解为就是一个应用程序,如当我们听音乐时,开启的程序就是一个进程;当我们听着音乐,写着代码,这个时候就开启了两个程序,有两个进程在运行。此时,相当于 CPU 在同时处理两个任务,属于并发,对用户来说,两个进程就像在同时运行一样。现代的多核处理器,确实可以做到多个进程并行。一个进程开启,操作系统会为这个进程分配独立的资源...

2019-07-22 00:25:22 153

原创 Serializable 和 Parcelable

1.序列化和反序列化序列化(Serialization)是将对象的状态信息转化为可以存储或者传输形式的过程,一般将一个对象存储到一个储存媒介,例如档案或记忆体缓冲等,在网络传输过程中,可以是字节或者 XML 等格式;而字节或者 XML 格式,可以还原成完全相等的对象,这个相反的过程又称为反序列化。2.序列化的作用通常完成序列化是由于以下三方面的需要:永久性保存对象,保存对象的字节序列...

2019-07-14 17:48:27 200

原创 AsyncTask 源码分析

AsyncTask 简介在 Android 中执行耗时任务时,我们一般不直接自己 new 一个 Thread,而且在 Android Studio 中也会给出提示,不建议使用传统的 Thread,那么有哪些方式呢?HandlerThread 是一个 Thread,内部使用 Handler,它与普通 Thread 的区别是通过 handler 向消息队列中添加消息,优势是可以利用 Mess...

2019-07-01 08:33:35 114

原创 okhttp3 源码分析

在上一篇 Retrofit 学习第三弹—源码分析篇 分析了 Retrofit 的源码,分析到请求 Call 位置,是调用的 okhttp3 中的 OkHttpClient 来完成请求的,所以 Retrofit 是基于 okhttp3 的一个封装,通过注解来设定参数构造出 Request,然后通过 OkHttpClient 创建 Call 实例。下面就来分析下 okhttp3 的流程。1. okh...

2019-06-23 23:48:11 244

原创 [Retrofit 学习第三弹——源码分析篇

Retrofit 是目前作为网络请求的主流框架,使用起来很方便,仅需在接口中定义方法,打上注解,而且和 Rxjava 配合起来,可以更好的完成网络请求时的线程切换问题。那么这样一个框架,我们有必要对它的源码分析一下,希望能够从中吸取到一定的东西,Retrofit 框架里面用到了很设多计模式,像外观模式,代理模式,工厂模式,适配器模式,装饰者模式等等,这无疑是学习设计模式很好的一个实例。如果对 R...

2019-06-10 17:39:34 228 1

原创 Android 布局中分割线创建的三种方式

在android中创建布局时,发现有些控件之间加一些分割线,会很美观,上网搜索了下,找到了三种方式创建分割线,下面就来分别来试一下。1. 使用View也是最简单的一种方式,直接定义宽度和高度,设置颜色即可。但是,分割线较多的布局中,这种不太适合,会占用较多内存<View android:layout_width="match_parent" android:layout_he...

2019-06-07 14:29:05 11205 1

原创 NDK开发学习笔记之javah及ndk-build

NDK开发学习笔记之JNI环境搭建 写到 NDK 的基本使用及环境搭建。并写了一个简单的 cpp 文件,但是有没有发现在编写 cpp 文件中的函数时,名字是不是很长,很容易写错!那么,哟没有方法,自动生成函数名呢?没错,你猜对了,还真有这样的工具—— javah。下面就来介绍 javah 的使用以及以下小技巧,此外还有 ndk-build 生成 so 的方法。概要javah 的使用...

2019-06-07 09:50:24 500

原创 Android Studio 中通过 CMake 方式使用 JNI

在 AS 中使用 Eclipse 中的方式构建 jni 环境,这种方式配置起来稍有麻烦,在 AS 中还有另外一种方式可以使用:即 CMake 方式。一、说点题外话:2015年6月26日,Android产品经理在Android官网发表博客1、2015年底停止对eclipse的adt更新支持,后续更新由eclipse团体提供2、推荐大家使用Android官方集成开发环境 Android Stu...

2019-06-07 09:39:36 500 1

原创 EventBus 使用及源码分析

EventBus 是我们日常开发中使用很频繁的一个三方库,原因很简单,使用 EventBus 可以很容实现解耦,不需要设置很多回调接口,如在 Fragment 和 Activity 之间的通讯,不同 Activity 之间、不同的线程之间,不同的 Service 之间等,使用 EventBus 会减少很多代码,而且看起来更加简洁,在 Android Studio 中点击左侧的小安卓图标可以很方便从...

2019-05-26 17:58:50 167

原创 属性动画详解

1. 动画分类Android 中动画分为 3 种:View 动画(视图动画)、帧动画、属性动画。(1)帧动画:将一系列的图片按照顺序播放,每一张图片就是动画中的一帧,连续播放后就形成了动画,使用起来比较简单,缺点是当图片过多或者过大时,容易导致 OOM。(2)View 动画:动画变化分为 4 种,平移、缩放、旋转、透明度,通过这 4 种动画其中的一种变换或者组合变换,使视图完成一种渐进式的动...

2019-05-04 16:08:28 446

原创 数据库学习之 greenDAO 源码分析

概述greenDAO 主要使用起来方便的地方,就是使用 @Entity 注解实体类后,只需要build工程,DaoMaster、DaoSession和对应的 Dao 文件就会自动生成,所以对于 greenDAO 来说,需要分析的主要就是 DaoMaster、DaoSession 和 xxDAO 这几部分。DaoMaster:使用 greenDAO 的切入点。 DaoMaster 保存数据库对...

2019-04-29 22:44:23 1697

原创 自定义 View - onDraw 过程详解

之前两篇文章分析了 onMeasure 过程和 onLayout 过程,不熟悉的童鞋可以回头去复习下,本篇文章来分析绘制过程的最后一个 onDraw 过程。这个过程的绘制使用到的 Paint 和 Canvas 在之前也有讲解到,在本篇的练习代码中有使用到,不会具体讲解这些知识点,不熟悉的话可以看看我之前的文章自定义 View - Paint 详解自定义 View - Canvas 详解Vie...

2019-04-21 23:51:24 1530 1

原创 自定义 View - layout 过程详解

在上一篇文章 自定义 View - Measure 详解 中讲了 View 的 Measure 过程,还不熟悉的童鞋可以翻过去看看。View 的 3 个过程是按照顺序执行的:measure --> layout --> draw测量(measure)过程是确定这个 View 的大小,布局(layout)过程是确定 View 的位置。layout 过程相比于 measure 过程简单...

2019-04-13 08:34:16 239

原创 数据结构与算法学习-二叉堆及堆排序

1. 二叉堆定义(1)堆是一个完全二叉树(2)堆中每一个节点的值都必须大于等于(或小于等于)其子树中每个节点的值。第一点,堆必须是一个完全二叉树。,除最后一层,其他层的节点个数都是满的,最后一层的节点都靠左排列。第二点,堆中的每个节点的值必须大于等于(或者小于等于)其子树中每个节点的值。也可以理解为,堆中每个节点的值都大于等于(或者小于等于)其左右子节点的值。这里我们借助于堆这种数...

2019-04-10 20:32:41 367

原创 自定义 View - Measure 详解

上图就是 View 绘制的主要过程,View 的绘制是从顶层的 DecoraView – ViewGroup(可能多个 ViewGroup)再到 View,按照这个流程从上往下,依次measure(测量),layout(布局),draw(绘制)。其中 Measure 过程是相对复杂的一个,但是其实我们梳理出来需要掌握测量过程的知识点,就很清楚了,下面就来一起看看 Measure 过程。Meas...

2019-04-07 22:58:21 335

原创 自定义 View - Canvas 详解

1.CanvasCanvas 是我们绘制各种图形或文字时主要的操作对象,因为绘制绘制过程调用的都是它的 drawXX 方法。官方给出的 Canvas 的解释:The Canvas class holds the “draw” calls. To draw something, you need 4 basic components: A Bitmap to hold the pixels,...

2019-04-03 20:36:38 409

原创 异步线程之 HandlerThread 和 IntentService

本篇主要讲解一下 HandlerThread 和 IntentService,其中 IntentService 内部使用了 HandlerThread,而 HandlerThread 是一个 Thread,内部使用到了 Handler 消息机制,对 Handler 消息机制还不熟悉的话,可以看看之前的两篇文章 消息机制 - Handler 使用 和 深入理解 Handler 消息机制下面就来看下...

2019-03-24 11:45:32 241

原创 数据结构与算法学习-二分查找及其变形

二分查找1、二分查找针对的是一个有序集合,查找思想主要采用分治思想。每次都通过跟区间的中间元素对比,将待查找的区间缩小为之前的一半,直到找到要查找的元素。要查找的元素比中间的元素小,则将范围缩小为集合的前半部分,如果待查找的元素比中间的元素大,则将将范围缩小为集合的后半部分,然后重复这个过程,直到找到元素的下标为止。2、二分查找的时间复杂度:O(logn)3、二分查找的局限性:(1)二分查...

2019-03-22 18:59:43 143

原创 数据结构与算法学习-排序算法(二)

很早之前整理过一篇**排序算法**,这次又整理了一下,增加了计数排序、归并排序和桶排序,需要的拿走不谢!各种排序算法实现public class Sort { /** * 交换数组中两个位置的数值 * * @param arr * @param i * @param j */ public static void ...

2019-03-22 18:39:04 130

原创 数据结构与算法学习-二叉查找树

之前整理了两篇关于二叉树的文章:征战二叉树-第一站征战二叉树-第二站这两篇都是基于二叉树,以及一些练习题,本篇主要对二叉查找树做一个实现,即增删改查,实际上二叉查找树也很容易理解,满足的条件就是左子节点的值小于根节点,右子节点的值大于根节点。代码实现public class BinarySearchTree<T extends Comparable<? super T>...

2019-03-21 11:20:56 124

原创 深入理解 Handler 消息机制

上一篇 - 消息机制 Handler 使用 文章讲了 Handler 的一个概述和基本的使用方法,这里还有一点需要强调一下:对于初学者一定要将你创建的子线程区分开,Handler 是你在子线程执行完,准备进行线程切换执行其他操作时才开始使用 Handler本篇主要对 Handler 的工作原理进行分析,即 Handler、Looper、MessageQueue 三者是如何工作的,从源码层面来分析...

2019-03-18 00:06:12 180

原创 动画还可以这么玩?使用 Toast 显示 or Dialog 显示

本篇不是讲解动画的设计,而是分析动画在使用过程中,如何合理显示遇到的一些坑,主要是由于特定场景引起的。问题相信大家都见过这样的点赞动画,点赞之后图片能够飘一会。思路:动画其实并不难,通过一个自定义 View,大小为显示动画的范围,通过一个 ImageView显示图片,然后通过动画根据设计的路径改变位置,透明度和大小,显示特定的时长。思路有了,然后就是实现,实现完成之后就出现了坑,坑不在这个...

2019-03-10 18:22:23 259

原创 消息机制 - Handler 使用

消息机制提到消息机制,很快想到 Handler,没错,Android 的消息机制主要就是 Handler 的运行机制,另外也不能缺少 Looper 和 MessageQueue。很多人认为 Handler 的作用是用来更新 UI 操作的,多数情况下, Handler 的确用来更新 UI,由于 Android 机制的限制,UI 操作只能在主线程完成,所以当进行一些耗时操作,如网络请求,IO 操作,...

2019-03-03 20:53:33 216

原创 自定义View 实战一 - 轻松显示星级

需求前面几篇文章主要都是在介绍一些自定义 View 的基础知识,本篇就来一起编写一个小 Demo,来感受感受。自定义 View 的编写,来源于产品的无理需求,有了需求,首先是要看现有的控件能否满足需求,或者控件的组合能否满足,现有的控件满足的话,就不必去造一个轮子,费时费力。再有,考虑产品的开发周期和开发质量,周期允许,质量要求较高,那么需要考虑使用自定义 View,能够带来性能上的提升。还有...

2019-02-24 16:39:39 259

原创 自定义 View - Paint 详解

上一篇 文章对自定义单一 View 进行了初步的介绍,对绘制的流程有了一个概念,本篇将对 Paint 部分进行详细 的介绍。上一篇中给出一张图,自定义 View 部分设计的知识点,对于 Paint 部分,也是很大的一块,Paint 的 API 很多,有各种样式,各种效果,颜色设置,抗锯齿,文字设置等。绘制的过程可以想象为画画,有画布和画笔。画布就是 Canvas,画笔是 Paint。 ca...

2019-02-18 00:00:45 213

原创 LRU简单实现-了解一下?

LRU 算法LRU 是一种作为缓存的算法,像 CPU 缓存,数据库缓存,浏览器缓存。以及在移动端开发时的图片安缓存,采用 LRU 缓存策略的应用很广泛。在面试中也是常常考察的一个点。当然也有其他缓存方法,常见的策略有三种:先进先出策略 FIFO(First In,First Out)、最少使用策略 LFU(Least Frequently Used)、最近最少使用策略 LRU(Least Rec...

2019-01-22 23:21:13 736

String类的工具类StringUtils jar包

org.apache.commons.lang3.StringUtils的jar包

2017-04-07

IO工具类IOUtils.jar

org.apache.commons.io.IOUtils的jar包 IOUtils jar

2017-04-07

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除