自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(66)
  • 收藏
  • 关注

原创 Proguard学习及App混淆

proguard-android.txt与proguard-android-optimize.txt当我们打Release的时候,Google会默认对我们的release包进行优化,这个优化是通过在modeule中build.gradle中的minifyEnabled来开启的。android { buildTypes { release { mi...

2019-07-21 14:49:12 428

原创 常见排序算法汇总及Java中默认实现

基本排序算法的分类及比较首先,上一张各种排序算法比较的图 排序方法 平均时间复杂度 最好情况下的时间复杂度 最坏情况下的时间复杂度 空间复杂度(辅助存储) 稳定性 直接插入排序 O(n^2) O(n) O(n^2) O(1) 稳定 希尔排序 O(n^1.5) O(n) O(n^2) O(1) 不稳定...

2018-09-16 13:09:32 754

原创 OkHttp中拦截器流程解析

OkHttp中,我们对请求报文和返回报文的处理都是在拦截器中进行的,所以熟悉OkHttp中的各个拦截器以及它们是怎样的处理流程是理解OkHttp的重点拦截器链首先,我们所最后得到的Response是通过这个函数得到的。Response result = getResponseWithInterceptorChain();而这个函数当中,就定义了各个拦截器的处理位置,...

2018-09-11 18:53:17 684

原创 LeetCode:01矩阵

题目如下:给定一个由 0 和 1 组成的矩阵,找出每个元素到最近的 0 的距离。两个相邻元素间的距离为 1 。示例 1:输入:0 0 00 1 00 0 0输出:0 0 00 1 00 0 0示例 2:输入:0 0 00 1 01 1 1输出:0 0 00 1 01 2 1注意:1.给定矩阵的元素个数不...

2018-08-30 11:11:52 1353

原创 Android绘制流程总结

我们在自定义实现一个自定义view的时候,往往需要重写它的onDraw()方法,在这个方法中,我们可以获取到它的Canvas对象,那么,这个Canvas对象是怎么得到的呢?首先我们知道Activity的视图是由一个Window来进行显示的,具体来说是一个Phone Window对象,而每个窗口又都会包含一个Surface,而Canvas就是由这个得到的,具体流程如下:当窗口需要绘制UI时...

2018-08-25 17:56:00 284

原创 再探synchronized关键字

Synchronized关键字实现了两个线程对同一个Monitor的互斥,可以用这个例子看出来: private static final Object lock1 = new Object(); private int i = 0; public static void main(String[] args) { M...

2018-08-19 16:35:45 192

原创 LeetCode:根据身高重建队列

题目如下:假设有打乱顺序的一群人站成一个队列。 每个人由一个整数对(h, k)表示,其中h是这个人的身高,k是排在这个人前面且身高大于或等于h的人数。 编写一个算法来重建这个队列。 注意:总人数少于1100人。示例输入:[[7,0], [4,4], [7,1], [5,0], [6,1], [5,2]]输出:[[5,0], [7,0], [5,2], [6,1...

2018-08-19 16:34:51 931

原创 Lock接口实现解析:到底什么是非重入锁和可重入锁

Java中接口的实现只给了ReentrantLock这一个默认的实现,也就是重入锁,它的概念是在获得锁后可以重复获得该资源的锁,但是这是一个听起来很绕的概念,重复获得该资源的锁是什么意思?如果不能获得,也就是这个锁是不可重入的,又会是怎么样的呢?请看下文重入锁与不可重入锁的区别先给出结论: 重入锁是可重复获得资源的锁,已经获得锁的线程可以对当前的资源重入加锁而不会引起阻塞;不可重入...

2018-08-12 15:06:28 1789

原创 synchronized关键字与volatile原理浅析

synchronized关键字与volatile关键字可以说是Java多线程的基础,无论是各种同步锁,还是我们所遇到的线程安全问题,都与这两个关键字有联系。SynchronizedSynchronized关键字我们经常用来执行线程间的互斥操作,使用示例如下: int x; public synchronized void setX(int x) { ...

2018-08-11 11:25:56 732

原创 Android事件分发机制总结

Android中的事件分发机制是我们实现触摸反馈、拦截等等的基础,了解了事件分发机制,对于触摸反馈事件失灵、多点触控等等的实现和疑难解决,都有一个敏感的认知。一切的开始: Activity的处理当我们的Android手机接收到手指的触摸动作的时候,手机会把这个动作包装成 MotionEvent ,之后这个 MotionEvent 事件会首先被Activity处理,源码如下:...

2018-07-30 23:09:28 155

原创 Https连接建立过程

Https的全称是Http over SSL,而SSL是在TCP协议之上的保密层,但是它也是属于传输层的,如果直接传输Http,报文的信息安全是无法被保障的,因为它在应用层的信息传输是明文传输的。过程Https传输建立的过程可以分为两个过程,信任建立的过程和连接建立的过程,如果再细分可以分为九个步骤,分别是:Client HelloServer Hello服务端向客户端发...

2018-07-14 16:19:43 2775 2

原创 同步器-倒计时门闩

Java中虽然提供了synchronized关键字对临界区进行线程同步访问,但是基于synchronized很难正确地编写同步代码,而倒计时门闩可以让一条或多条线程在“门口”一直等待,直到门闩的计数变量为0,线程才可以继续执行。组成类java.util.concurrent.CountDownLatch实现了倒计时门闩同步器,它是由一个计数变量和两个操作数组成的,这两个操作分别是“导致一条...

2018-07-08 15:31:13 317

原创 类与实例的初始化顺序

在Java中,static修饰符一直都是很重要的知识点,特别是当它修饰为一个静态代码块的时候,还有它被用来修饰变量的时候,当发生继承关系或者是内部类关系的时候,我们这里分几种情况进行讨论当发生继承关系的时候如:public class SuperClass { private static int superInt = 12345; static {...

2018-06-30 15:58:01 253

原创 锁、重入锁与条件

Java中的锁框架指的是java.util.concurrent.locks这个包里的,不同于对象的内置加锁同步以及java.lang.Object的等待/通知机制,包含锁框架的并发工具通过轮询锁、限时等待及其他方式改善了这种机制。锁这里的锁指的是接口Lock方法包含了如下几种方法:void lock():获取锁。当锁不可用时,调用线程会被强制一直等待直到锁可...

2018-06-30 15:56:46 1540

原创 Android NDK调用不符合jni规范的so文件

我们在使用Android静态加载so库的时候,一般都需要这个so库是符合jni命名规范的,像这样: Java_全类名_方法名但是可能会遇到一些比较特殊的情况,同事只给了你一个so库,这个so库并不是用的jni命名,除此之外,他还给了你一个so库中函数的头文件,这时候我们就需要自己再次包装这个so库了。建立java文件这里建立的java文件命名可以是自定义的,而不需要遵守某...

2018-06-30 15:55:57 1907

原创 Java中的正则表达式(一)

Java中应用正则表达式必须依靠Pattern与Matcher类,常用的正则规范一般如下: 序号 规范 描述 1 \ 表示反斜线(\)字符 2 \t 表示制表符 3 \n 表示换行 4 [abc] 字符a、b或c 5 [^abc] 表示除了a、b、c之外的任意字符 6 [a-z] ...

2018-04-05 15:40:50 203

原创 Android编译时注解

这个寒假用空闲时间做了一个基于编译时注解的RxBus,目前还没有做工程化处理,但是基本的功能已经写好,欢迎大家star和forkRxEventBus趁着寒假最后一天来写一下开发过程。编译时注解总结注解分为源码级注解、编译时注解与运行时注解,编译时注解和运行时注解时被经常用到的,但是运行时注解因为使用了反射机制,所以在性能上会有所降低,编译时注解就成了最受追捧的注解方式。...

2018-02-23 15:07:14 399

原创 Git高级命令

汇总 git中比较复杂的命令如下表所示: 命令 作用 git rebase 在新位置重新提交 git revert 撤销commit git reset 丢弃提交 git stash 临时存放工作目录的改动 git reflog 找回分支git rebase作用rebase的意思是,给...

2018-02-15 15:07:56 790

原创 AsyncTask解析

在Android AsyncTask中有以下几个主要的函数:onPreExecute()doInBackground(Params…)onProgressUpdate(Progress…)onPostExecute(Result)函数的作用及解析onPreExecute()这个方法是在主线程中执行的,一般在任务执行前做准备工作。doInBackground...

2018-02-15 15:07:05 190

原创 Git基础命令汇总

汇总表如下所示 命令 作用 注意事项 git clone 把远程仓库取到本地 可能会需要输入GitHub的帐户名和密码,其中密码时不显示输入的 git log 查看历史记录 加上后缀-p查看详细历史,–stat查看简要统计,查看完按q键退出 git status 查看工作目录当前状态 git show 查看...

2018-02-14 21:10:19 164

原创 Map的方方面面

常见的Map实现类 Map类 特性 HashTable Map基于散列表的实现,HashTable继承自抽象类Dictionary(Dictionary是一个被废弃的接口),是线程安全的。 HashMap Map基于散列表的实现(取代了HashTable)。继承自抽象类AbstractMap,插入和查询“键对值”的开销是固定的。 LinkedHas...

2018-02-13 15:35:57 163

原创 从不同角度看同一数据结构-访问者模式

访问者模式是一种复杂的设计模式,使用频率不高,下面举一个公司对员工业绩考核的例子,CEO和CTO对员工的考核标准是不一样的员工抽象类public abstract class Staff { public String name; public int kpi; public Staff(String name) { this.name = n

2018-01-18 17:29:28 205

原创 让函数有执行顺序-模板方法模式

我们知道在一般情况下,Android中Activity的生命周期如图所示执行顺序为onCreate()->onStart()->onResume()->onPause()->onStop()->onDestroy(),这个就是模板方法模式的使用之一我们可以来模拟以下Activity所使用的模板方法模式,具体步骤如下:抽象类:定义算法框架,也就是执行顺序public abs

2018-01-17 18:23:06 352

原创 容器中的游标-迭代器模式

迭代器模式又称为游标模式,Java中的List遍历就可以使用迭代器,而不需要使用“明显”的遍历算法,下面举一个迭代器模式的小例子迭代器接口public interface Iterator { boolean hasNext(); T next();}具体迭代器类public class ConcreteIteratorT> implements I

2018-01-16 12:37:51 264

原创 设计模式中的撤销-备忘录模式

在开发过程中,我们可能会遇到保存对象目前的状态,到必要的时候再进行恢复的需求,这类似于数据库中的后援副本,到出现故障时数据库可以回到转储时的状态备忘录模式的示例在一般软件的开发中,备忘录模式是使用得比较少的设计模式,但是在游戏开发过程中,备忘录模式是使用得很频繁的,这里就举一个小游戏的例子游戏类public class Mario { private int

2018-01-15 12:28:47 307

原创 Java中内置的设计模式-观察者模式

观察者模式是jdk中内置的模式,也是使用频率最为广泛的设计模式之一,著名的开源项目如RxJava、EventBus中都能够看到它的影子,甚至在跨进程通信中,我们也经常用到观察者模式这里只举例一个使用jdk中内置观察者模式的例子:公众号发推送的例子,公众号发文章后,每个订阅该公众号的用户都会得到推送观察者public class User implements Observer {

2018-01-14 15:03:35 224

原创 命令模式

命令模式对简单的调用关系进行解耦,再大多数情况下我们可以使用直接调用的方式来做,但是如果调用比较繁琐,那么使用命令模式不失为一个好选择这里举一个超级马里奥移动的例子来讲解命令模式超级马里奥的动作类public class Mario { public void toLeft() { System.out.println("向左移"); }

2018-01-13 16:55:38 166

原创 gradle的执行顺序

gradle执行顺序是理解gradle的重要一步,我们可以随便举一个多项目的例子例如其中Project为FancyView,由两个Module,app和OpingStartAnimation组成,还有配置文件seetings.gradle执行顺序为:解析settings.gardle配置模块执行project的afterEvaluate回调执行task

2018-01-13 16:54:39 2075

原创 Java项目构建:多项目

多项目构建其实构建Java多项目和单项目差不多,唯一需要改变的就是在setting.gradle中加上如下代码include ':app', ':openingstartanimation'其中app是我构建的主项目,而openingstartanimation则是依赖项目项目之间的依赖关系例如,在上一个项目中app与openingstartanimation这两个项目

2018-01-12 11:46:04 826

原创 解释器模式

解释器模式时一种使用的比较少的行为类设计模式,也比较难以理解,但是在系统设计的时候,解释器模式则被广泛地使用了,比如说在解析文件的时候这里举一个解释器模式的简单例子抽象算数运算解释器public abstract class ArithmeticExpression { public abstract int interpret();}数字解释器publ

2018-01-12 11:43:46 134

原创 Java项目构建:基础单项目

构建一个Java项目其实十分地简单,只需在gradle中进行配置,然后执行就可以了Java插件要配置一个Java项目,首先我们地安装Java的插件,在gradle.build文件顶部写入以下代码apply plugin: 'java'再执行任务安装插件这样Java的插件就安装完毕了Android插件在Android开发中,我们在gradle.build文件

2018-01-11 10:55:16 635

原创 设计模式中的车轮战-责任链模式

责任链模式在Android中的应用莫过于事件分发了,ViewGroup对事件分别给子View,从ViewTree的顶部至上而下地进行处理,直到事件被消化为止,这种方法在Android广播中也能看到责任链模式的实现分为以下几个部分请求者public class Request { private Object object; private int Request

2018-01-11 10:54:23 167

原创 对象内部的策略改变-状态模式

状态模式比较常见的是运用在登陆或未登陆的情况下进行,因为在用户登陆与未登陆这两种情况下,对相同的动作会有不同的反应状态模式的使用一般分为以下几步定义状态接口以及相应的动作public interface State { void statement(); void report();}定义每种不同的状态相应的动画登陆状态时的动作publi

2018-01-10 20:33:39 188

原创 Gradle Task

task 的创建方式快捷方式我们一般使用最快捷的方式来创建任务,像这样task hello << { println 'Hello world!'}动态方式我们可以使用groovy动态地创建任务,像这样3.times { counter -> task "task$counter" << { println "this is

2018-01-10 20:32:24 371

原创 gradle中的Setting文件与Build文件

Setting文件Setting文件可以说是子项目(也可以说是Module)的配置文件,大多数setting.gradle的作用是为了配置子工程,再Gradle多工程是通过工程树表示的,如在Android studio中我们指定相应的module能在主工程当中使用,需要这样include ':example'Build文件Build是Project的配置文件,我们可以配置版

2018-01-07 12:16:13 9837

原创 策略模式:再见if-else

在软件开发中,我们时常用到if-else来对进行条件判断,然后再进行相应的操作,但这样做会使得项目再日后的维护中出现困难,所以,当遇到比较复杂的if-else结构的时候,使用策略模式是很好的选择举一个简单的计算小例子,如对两个数进行加减乘除第一步,定义计算接口public interface CalculateStrategy { int calculateComeo

2018-01-07 12:15:25 1014

原创 gradle中使用的编程语言-Groovy

和Java一样,Groovy也是基于JVM虚拟机的一种动态语言,甚至Groovy完全兼容Java,当然,它也有很多Java没有的特性,比如支持闭包和DSL关于Groovy字符串、集合、方法的使用这里就不说了,即使是从来都没有接触过Groovy,我们见到的时候也能明白,网上也有大量的资料,这里就不赘述了闭包 闭包是Groovy的一个非常重要的特性,也是DSL的基础首先,举

2018-01-06 13:17:48 2369

原创 创建同一”类别“下的对象-抽象工厂模式

抽象工厂模式看起来与工厂方法模式相似,但工厂方法模式构建的是继承同一抽象类的对象,而抽象工厂模式创建出的对象并不是继承于同一基类的,所以,我们无法使用工厂方法模式那样的反射来创建对象抽象工厂模式的类主要分为四类,分别是:抽象工厂类、具体工厂类、抽象产品类、具体产品类。 与工厂方法模式不同的地方是工厂方法模式的抽象产品类和具体工厂类只有一个,而抽象工厂模式的抽象产品类可能有许多个,

2018-01-06 13:15:27 203

原创 gradle Wrapper及其他

Wrapper是对gradle的一层包装,是为了在开发过程中可以使用同样的gradle版本进行开发生成wrapper想要为自己的项目引入gradle,我们只需要在Terminal下输入gradle wrapper接着就构建成功了可以看到,根目录下多了如下文件我们可以指定一些参数来控制gradle的生成,如依赖的版本等等,方法如下:-gradle

2018-01-05 20:23:47 442

原创 复杂对象的创建-工厂方法模式

在Android开发中,最常见的工厂模式应该就是Bitmap的创建了,因为Bitmap的创建是分很多种方式的,我们可以使用本地文件来创建Bitmap对象,也可以使用网络上的资源来创建Bitmap对象,具体方法如下:BitmapFactory.decodeResource(this.getResources(),R.drawable.haha); //使用本地文件HttpURLConnect

2018-01-05 12:06:28 328

空空如也

空空如也

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

TA关注的人

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