自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(104)
  • 资源 (2)
  • 收藏
  • 关注

原创 NDK、音视频、图形学、计算机视觉 知识体系学习目录

C++JNICMake

2021-01-14 11:58:45 353

原创 Android 知识体系学习目录

随着工作时间的增长,越发觉得自己的知识不够系统和全面,因此为了方便读者阅读以及从点到面来逐步建立并完善自己的知识体系,总结写过的文章和一些想要写的文章目录如下:本目录下的内容是个人学习 Android 高级知识的路线,并加入了一些基础准备知识。基础准备1、JavaJava 基础 - String、StringBuilder、StringBufferJava 基础 - 关于 equa...

2018-05-03 17:23:36 1522 1

原创 暴力突破 JNI

一、前言JNI 简单来说就是 java 调用本地 C/C++ 的技术,JVM 就是通过大量的 JNI 技术使得 Java 能在不同平台上运行。它允许 Java 类的某些方法用原生方法实现,这些原生方法也可以使用 Java 对象,使用方法与 Java 代码调用 Java 对象的方法相同。原生方法可以创建新的 Java 对象或者使用 Java 应用程序创建的对象。二、简单示例现在我们来看下官方示例,在 Android Studio 上创建一个 Native C++ 工程:创建好后的项..

2021-01-02 14:53:53 328 1

原创 暴力突破 Flutter 自动化测试

一、前言移动应用的测试往往比较复杂且工作量很大,为了验证用户的真实使用体验往往需要跨越多个平台以及不同的物理设备手动测试。随着产品功能不断迭代累积,测试的复杂度随之大幅增长,手动测试会变得更加困难。因此,编写自动化测试用例对我们的项目更新、迭代有着非常重要的作用。二、单元测试单元测试是指对软件中的最小可测试单元进行验证的方式,使用单元测试可以验证单个函数、方法或类的行为。我们来看看 Flutter 项目的工程目录:如上图所示,lib 是 Flutter 应用源文件目录,test 是.

2020-11-04 22:16:51 2036

原创 来鹅厂后的一些感悟

一、前言上一篇博客还是5月底写的,不知不觉已经有5个月没写博客了。5个月一眨眼就过去了,从6月2号投递简历开始面试,到7月19号拿到offer,提出离职进行工作交接,再到8月19入职。入职鹅厂后开始进行入职培训,以及适应新工作环境。这5个月非常的充实,趁着今天1024程序员节简单分享一下这段时间的一些想法。二、感悟2.1 工作思维的转变以前开发都是由业务驱动,完成业务需求即可,换句话说就是被推着走。而来到鹅厂后,这里非常注重个人能力的积累以及发掘技术点,也就是说除了做业务需求以外,.

2020-10-24 19:31:49 862 3

原创 暴力突破 Android 编译插桩(八)- class 字节码

一、Class 类文件结构Java 虚拟机当初被设计出来的目的就不单单是只运行 Java 这一种语言。目前 Java 虚拟机已经可以支持很多除 Java 语言以外的其他语言了,如 Groovy、JRuby、Jython、Scala 等。之所以可以支持其他语言,是因为这些语言经过编译之后也可以生成能够被 JVM 解析并执行的字节码文件(class 文件)。而虚拟机并不关心字节码是由哪种语言编译而来的。为了让 Java 语言具有良好的跨平台能力,Java 提供了一种可以在所有平台上都能使用的一种中间代码

2020-05-25 23:19:37 630

原创 暴力突破 Android 编译插桩(七)- AspectJ 使用

一、AOP 理解在 Java 当中我们常常提及到的编程思想是 OOP(Object Oriented Programming)面向对象编程,即把功能或问题模块化,每个模块处理自己的事务。但在现实世界中,并不是所有问题都能完美地划分到模块中。比如,我们要完成一个事件埋点的功能,我们希望在原来整个系统当中,加入一些事件的埋点,监控并获取用户的操作行为和操作数据。按照面向对象的思想,我们会设计一个埋点管理器模块,然后在每个需要埋点的地方都加上一段埋点管理器的方法调用的逻辑。看起来好像没有什么问题,并且我们之前

2020-05-19 23:59:20 1371

原创 暴力突破 Android 编译插桩(一)- 入门

一、前言随着 Android 开发的发展,越来越多场景需要用到编译插桩了。日常开发中我们肯定也都接触过编译插桩,只是没有去深入挖掘它的实现原理,比如 ButterKnife、无痕埋点等,所以学习编译插桩不仅可以提升我们的竞争力,还可以让我们在开发中开拓视野、更好地解决问题。我们经常使用Gradle Plugin + 编译插桩的方式,因此在学习编译插桩前,建议先看一下我的《Gradle 专栏》学习现在让我们一起学习一些编译插桩的基础来入门。二、编译插桩基础知识顾名思义,所谓的编译...

2020-05-18 21:00:12 944

原创 暴力突破 Gradle 自动化项目构建(八)- Android 对 Gradle 的扩展:Variants、Transform

一、前言

2020-05-09 09:57:33 3179

原创 暴力突破 Gradle 自动化项目构建(七)- 其他模块及自定义 Gradle 插件

SettingSourceSet

2020-05-05 21:00:02 671

原创 暴力突破 Gradle 自动化项目构建(六)- Gradle 核心之 Task

一、前言只有 Task 才可以在 Gradle 的执行阶段去执行(其实质是执行的 Task 中的一系列 Action),所以 Task 的重要性不言而喻。二、Task2.1 Task 定义与配置Task 的定义方式有如下两种:Task 的配置方式也有如下两种:配置了 group 后可以在 Android Studio 的 Gradle 面板看到对应的 Task...

2020-05-03 22:27:41 459

原创 暴力突破 Gradle 自动化项目构建(五)- Gradle 核心之 Project

一、前言Project 是 Gradle 构建整个应用程序的入口,所以它非常重要。我们看下面这张图:上图是我创建的一个 Android 工程,并添加了一个 test module。我们在命令行中输入 gradle projects 命令看看有哪些 project:可以看到输出了三个 project,其中 GradleTextProject 是根 project,而 app、te...

2020-05-03 20:15:53 684

原创 暴力突破 Gradle 自动化项目构建(四)- Gradle 核心之生命周期

一、

2020-05-01 13:18:34 492

原创 暴力突破 Gradle 自动化项目构建(三)- Groovy 高级用法

一、Groovy 高级用法1.1、Json 操作我们先来看看 groovy 中对象与 json 字符串之间的相互转换:除此之外,我们也可以直接使用 java 的类库来操作 json,比如 java 的 gson 库。下面我们来看个真实请求网络并解析返回 json 的例子:1.2、XML文件java 中处理 xml 文件有以下两种方式:groovy 处理...

2020-04-30 09:31:17 438

原创 暴力突破 Gradle 自动化项目构建(二)- Groovy 核心语法

一、前言二、Groovy 核心语法2.1 Groovy 中的变量2.1.1 变量的类型真正意义上讲 groovy 中是不存在基本类型的,无论我们定义基本类型还是对象类型,都会被转换为对象类型。下面我们看个例子:可以看到,基本类型会被我们的编译器编译成包装类型。2.1.2 变量的定义groovy 变量的定义与 Java 中的方式有比较大的差异,...

2020-04-25 23:53:04 1030

原创 暴力突破 Gradle 自动化项目构建(一)- 入门以及 Groovy 环境搭建

一、前言

2020-04-25 23:52:59 489

原创 暴力突破 Java 并发 - ThreadLocal 原理解析

一、ThreadLocal 使用ThreadLocal 是一个关于创建线程局部变量的类。通常情况下,我们创建的变量是可以被任何一个线程访问并修改的。而使用hreadLocal建的变量只能被当前线程访问,其他线程则无法访问和修改。接下来我们 ThreadLocal 如何使用:创建,支持泛型:ThreadLocal<String> mStringThreadLocal = n...

2020-04-08 21:02:28 208

原创 暴力突破 Java 并发 - 线程池

一、线程池的定义相比 new Thread() 方法创建线程,Java 提供线程池的好处在于:重用存在的线程,减少线程创建、消亡的开销,性能佳。 可有效控制最大并发线程数,提高系统资源的使用率,同时避免过多资源竞争,避免堵塞。 提供定时执行、定期执行、单线程、并发数控制等功能。ExecutorService 是最初的线程池接口,ThreadPoolExecutor 类是对线程池的...

2020-04-08 19:37:26 219

原创 暴力突破 Java 并发 - 线程间的协作(wait、notify、notifyAll、yield、join)

一、线程的状态Java 中线程中状态可分为五种:New:新建状态,当线程创建完成时为新建状态,即new Thread(...),还没有调用start方法时,线程处于新建状态。 Runnable:就绪状态,当调用线程的的start方法后,线程进入就绪状态,等待CPU资源。处于就绪状态的线程由Java运行时系统的线程调度程序(thread scheduler)来调度。 Running:运行...

2020-04-08 10:33:16 211

原创 暴力突破 Java 并发 - CAS 解析

一、CAS 概念在 JDK 5 之前 Java 语言是靠 synchronized 关键字保证同步的,这会导致有锁,锁机制存在以下问题:在多线程竞争下,加锁、释放锁会导致比较多的上下文切换和调度延时,引起性能问题。 一个线程持有锁会导致其它所有需要此锁的线程挂起。 如果一个优先级高的线程等待一个优先级低的线程释放锁会导致优先级倒置,引起性能风险。volatile 是不错的机制,但是 ...

2020-04-07 22:48:43 243 1

原创 Android RecyclerView 重难点解析

一、基本使用RecyclerView 的适配器通常的写法如下:public class TestAdapter extends RecyclerView.Adapter<TestAdapter.Holder> { private List<UserEntity> mList; public TestAdapter(List<UserEn...

2020-04-07 16:46:06 948

原创 Android ListView 重难点解析

一、基本使用public class FruitAdapter extends ArrayAdapter<Fruit> { private int resourceId; public FruitAdapter(Context context, int textViewResourceId, List<Fruit> objects) { ...

2020-04-07 12:02:20 279

原创 Android 手把手进阶自定义View(十七)- 自定义 ViewPager

一、基础准备在上一篇Android 手把手进阶自定义View(十六)- 滑动冲突中最后的实例其实我们已经实现了一个简单的自定义 ViewPager,只不过上一篇我们的重点是滑动冲突,所以没具体解释 ViewPager 里的一些触摸反馈代码。这篇文章我们来学习一下。二、自定义 ViewPager...

2020-04-06 23:02:23 190

原创 Android 手把手进阶自定义View(十六)- 滑动冲突

一、前言在界面中,只要内外两层同时可以滑动就会产生滑动冲突。而滑动冲突的解决都是由固定的套路的,下面我们来学习一下。二、常见的滑动冲突场景常见的滑动冲突场景可以简单的分为如下三种:场景1、外部滑动方向与内部滑动方向不一致比如 ViewPager 中有多个 Fragment,而 Fragment 往往有一个 ListView。这时 ViewPager 可以左右滑动,而 Li...

2020-04-06 18:52:42 295

原创 Android 手把手进阶自定义View(十五)- 多指触摸

一、基础准备1.1、MotionEvent.getActionMasked()常见值:ACTION_DOWN:第一个手指按下(之前没有任何手指触摸到 View) ACTION_UP:最后一个手指抬起(抬起之后没有任何手指触摸到 View,这个手指未必是 ACTION_DOWN 的那个手指) ACTION_MOVE:有手指发生移动 ACTION_POINTER_DOWN:额外手指按...

2020-04-03 17:11:28 2042

原创 Android 手把手进阶自定义View(十四)- ScalableImageView

一、基础准备Android 手把手进阶自定义View(十)- 事件分发机制解析Android 手把手进阶自定义View(十一)- 手势检测 GestureDetectorAndroid 手把手进阶自定义View(十二)- 缩放手势检测 ScaleGestureDetectorAndroid 手把手进阶自定义View(十三)- 滚动计算 Scroller、OverScroller经过前四篇的...

2020-04-02 20:10:32 418

原创 Android 手把手进阶自定义View(十三)- 滚动速度 VelocityTracker 及滚动计算 Scroller、OverScroller

一、前言Scroller 和 OverScroller,这两个是 Android UI 框架下实现滚动效果的最关键的类,ScrollView 内部的实现也是使用的 OverScroller,所以熟练的使用这两个类的相关API,可以让我们满足大部分的滚动开发需求。二、Scroller在 View 类里面,有两个和滚动相关的类 scrollTo() 和 scrollBy。这两个方法可...

2020-04-01 17:21:38 1290

原创 Android 手把手进阶自定义View(十二)- 缩放手势检测 ScaleGestureDetector

一、前言Android 缩放手势检测 ScaleGestureDetector,在大多数的情况下缩放手势都不是单独存在的,需要配合其它的手势来使用,如果是用在自定义的控件上,则需要配合 Matrix 相关内容使用起来可能会更加方便。缩放手势最常见于以下的一些应用场景中,例如:图片浏览,网页缩放、地图等。二、缩放手势检测缩放手势检测同样是官方提供的手势检测工具,它的使用方式的 Ge...

2020-04-01 15:32:40 1362

原创 Android 手把手进阶自定义View(十一)- 手势检测 GestureDetector

一、前言二、手势检测三、滑动手势检测

2020-03-31 23:42:14 688

原创 Android 手把手进阶自定义View(九)- 自动换行 ViewGroup

一、基础准备《Android 手把手进阶自定义View(六)- measure 测量过程解析》 《Android 手把手进阶自定义View(七)- layout 布局过程解析》 《Android 手把手进阶自定义View(八)- draw 绘制过程解析》前三篇我们学习了 View 的三大流程:测量、布局、绘制,本篇我们来做一个自动换行的 ViewGroup。二、自动换行的 Vi...

2020-03-29 13:51:11 432

原创 Android 手把手进阶自定义View(五)- MaterialEditText

一、前言本篇我们来学习拓展已有的 View,比如继承EditText 来对它进行拓展。要实现的效果如下:二、MaterialEditText分析一下,首先第一步,预留浮动文字的距离。可以在初始化时通过 setPadding 来设置。第二步,绘制浮动文字,文字可以通过设置的 hint 值获取。第三步,通过动画来实现浮动文字的透明度、垂直偏移的变化。完整代码如下:...

2020-03-27 16:58:48 619

原创 Android 手把手进阶自定义View(四)- 三维变换

一、基础准备本篇我们来学习一下自定义 View 中使用 Camera 来做三维变换,先看一下自定义 View 1-4 Canvas 对绘制的辅助 clipXXX() 和 Matrix二、Camera 介绍先来看看适用 Camera 时的三维坐标系结构:camera 相当于在 z 轴有个照相机(下图中黄色圆圈就代表 camera),对视图进行投影,效果如下:使用...

2020-03-25 10:49:51 605

原创 Android 手把手进阶自定义View(二)- 文字

一、基础准备自定义 View 1-3 drawText() 文字的绘制二、圆环进度条,文字横向、纵向居中如上图所示,上图的绘制可以分为三步:底圆环、进度条、中间文字。圆环的绘制可以直接把 Paint 的边加粗然后绘制一个圆框即可即可:Paint.setStyle(Paint.Style.STROKE)Paint.setStrokeWidth()进度条的的绘...

2020-03-22 21:29:59 304

原创 Android 手把手进阶自定义View(一)- 基础绘制

一、基础准备1.1 自定义View相关API首先来学一下自定义 View 基本的 API,推荐看看下面这两篇博客,介绍得非常详细:HenCoder Android 开发进阶: 自定义 View 1-1 绘制基础HenCoder Android 开发进阶: 自定义 View 1-2 Paint 详解1.2 三角函数相关知识三角函数属于基本数学的范畴,这里我们重新回顾三角函...

2020-03-21 14:47:43 527

原创 Android Memory Profiler、CPU Profiler、MAT 解决内存问题实战

一、前言二、Memory Profiler 使用实战三、MAT 使用实战

2020-03-18 22:54:13 1136

原创 Android 内存泄漏场景梳理

一、前言内存泄漏向来都是内存优化的重点,那么它到底是什么呢?简而言之对象在生命周期结束时被另一个对象通过强引用持有而无法释放造成的。在学习内存泄漏常见之前可以看一下我之前的这两篇博客《Java 虚拟机 - 运行时内存区域》《Java 虚拟机 - 垃圾回收知识梳理》。下面来介绍一下内存泄漏常见的发生场景。二、非静态内部类、匿名内部类非静态内部类和匿名内部类都会持有外部类实例的引用,...

2020-03-18 17:56:24 561

原创 Android 断点续传解析

一、原理断点续传,顾名思义就是下载文件时不必每次都重新开始,可以从之前已经下载好的地方接着下载,这样既可以省流量还能省时间。那么怎么样才能做到呢?这就要靠 RandomAccessFile 这个类了,来看看 RandomAccessFile 这个类的定义:public class RandomAccessFile implements DataInput, DataOutput, Clo...

2020-02-10 21:26:55 398

原创 Android Bitmap 的高效加载解析

一、Bitmap 占用的内存在 Android 手机运行时 Bitmap 占用的内存计算:Bitmap 内存占用 ≈ 像素数据总大小 = 图片宽 × 图片高× ( 设备dpi / 资源目录dpi ) ^ 2 × 单个像素的字节大小其中单个像素的字节大小由 Bitmap 的一个可配置的参数 Config 来决定。Bitmap 中存在一个枚举类 Config,定义了 Android 中...

2020-02-10 20:17:54 340

原创 Android LruCache 缓存机制解析

一、前言关于 Android 的三级缓存,其中主要的就是内存缓存和硬盘缓存。这两种缓存机制的实现都应用到了 LruCache 算法。一般来说,缓存策略主要包含缓存的添加、获取和删除这三类操作。如何添加和获取缓存这个比较好理解,那么为什么还要删除缓存呢?这是因为不管是内存缓存还是硬盘缓存,它们的缓存大小都是有限的。当缓存满了之后,再想其添加缓存,这个时候就需要删除一些旧的缓存并添加新的缓存。...

2020-02-10 15:17:06 148

原创 Java 集合 - HashTable 解析

一、前言Hashtable 与 HashMap 都是 Map 族中较为常用的实现,也都是 Java Collection Framework 的重要成员,它们的本质都是 链表数组。下面我们来学习一下 HashTable。二、HashTable 解析2.1 定义Hashtable 和 HashMap 既是 Java Collection Framework 的重要成员,也是 M...

2020-02-09 22:52:29 304

《Effective Java(中文版第2版)》

《Effective Java(中文版第2版)》《Effective Java(中文版第2版)》

2018-08-13

空空如也

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

TA关注的人

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