自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 一步一步带你了解Hybrid开发框架之DsBridge

Hybrid开发即 原生与前端的混合开发,常指原生+H5的混合开发。在此之前,我们来梳理下,原生与H5交互的最原始做法(这里基于android)。android与js交互android与js交互的核心思想是通过向页面注入javascript代码间接调用H5脚本中定义的方法。WebView为我们提供了两种注入方式,一种有回调,一种无回调。SDK<19,android提供的无回调方法:l...

2019-10-26 17:55:34 2781 1

原创 Handler机制

Handler负责将消息Message发送到消息队列MessageQueue中MessageQueue通过enqueueMessage()方法将消息Message加入消息队列中Looper负责将消息Message从消息队列MessageQueue中取出。

2022-10-17 19:26:06 426 1

原创 带你彻底搞懂 哈希表 的前世今生

哈希表哈希表是一种数据结构,基于数组,它可以提供快速的插入操作和查找操作。在认识哈希表之前,我们先来看一个场景:将一个公司的100名员工信息存储起来,每个员工都有编号,从0~99,这里,员工编号是连续、有序且不会重复的。在这种情况下,我们很自然地会想到用数组来存储,把编号作为数组下标,然后将员工信息压入数组中,这样查找员工就很方便很快速了。/** * 员工信息类 */public class Customer { private int id; private String na

2020-05-26 20:33:37 898

原创 Gradle构建之-资源冲突问题

Gradle构建之-资源冲突问题我们在构建项目时,经常会导入各种第三方jar、aar,在编译的过程中,你是否碰到过类似于下面这样的异常?乍一看,可能不知道无从下手,因为它并不像其他资源冲突的情况,会直接告诉你哪个资源冲突了。遇到这样情况,我们可以分三步走:1.寻找冲突源头通过AndroidStudio->Navigate->class,输入你需要查找的资源名,像上面这种情况,...

2019-09-06 12:24:31 536

原创 深入理解动态代理02

关于动态代理的内部原理请看前面的文章 深入理解动态代理。这次我们来谈谈动态代理的封装。动态代理的封装java通过Proxy.newProxyInstance()方法来动态获取我们需要的代理类字节文件,比如我们需要获取ArrayList的代理类,可以这么写:List proxy = (List) Proxy.newProxyInstance(List.class.getClassLoader(...

2019-07-13 16:47:46 153

原创 泛型

泛型类型擦除jdk1.5提供了泛型这一新特性,它是给javac编译器使用的,可以限定集合中的输入类型,让编译器挡住原程序中的非法输入,编译器编译带类型说明的集合时会擦除类型信息,使程序运行效率不受影响。 List<Integer> list1 = new ArrayList<>(); List<String> list2 = new Arr...

2019-07-13 00:47:26 142

原创 hashCode()与equals()

hashCode()作用按照先例,先上段代码:public class Person { public String name; public int age; public Person(String n, int a){ this.name = n; this.age = a; }}Collection collection = new ArrayList<...

2019-07-12 04:05:46 129

原创 “==”与 equals的区别

“==”与 equals的区别在java中," == " 作为关系运算符,对于基本数据类型而言,"=="比较的是值的大小;对于引用数据类型而言,比较的则是内存中的地址,即是否为同一对象的引用。equals用于比较引用数据类型的具体内容是否相同,它不适用于基本数据类型的比较。“==”在基本数据类型与封装类型的不同表现int a = 10;int b = 10;System.out.pri...

2019-07-11 21:27:36 151

原创 数据结构-队列

队列跟栈一样,只能访问单个元素,但相较于栈的LIFO(后进先出),则表现为FIFO(先进先出),它总是最先移除先进入队列的元素,即队头元素。循环队列public class Queue { private int maxSize; private long[] queueArray; private int start; private int end; private int it...

2019-07-01 17:49:08 117

原创 数据结构-栈

栈栈作为一种后进先出的抽象数据类型,相对于数组而言访问其元素更加受限,这体现在数组只需要知道某个元素下标即可直接访问,或者遍历获取所有元素;而栈只允许访问一个数据项,即每次只能访问栈顶的元素,移除栈顶元素后,才能访问倒数第二个元素。代码实现我们可以用java代码模拟栈结构/** * 栈 * @author sunyan * */public class Stack { priv...

2019-06-30 12:23:59 156

原创 我的设计模式之旅-责任链模式

一、什么是责任链模式?我的理解是:将请求处理者按链式排列,当发送一个请求时,请求会由链式入口访问,直到找到可以处理它的处理者为止。二、使用场景比如:对于公司的报销流程,当报销金额 < 1000 需要向组长申请;1000 < 5000需要向部门负责人申请; > 5000 则需要向总监申请。依次向上申请,且不能越级处理。如果申请金额为4000,则先开始向组长申请,然后组长向上申...

2019-06-27 17:19:31 149

原创 MVP瘦身方案的可行性

MVP瘦身方案的可行性自google发布mvp架构demo以来,越来越多的人开始在项目中尝试使用mvp架构来搭建自己的项目。mvp的发布初衷也是为了将逻辑代码与UI分离,通过接口的方式互通,达到解耦的目的。但用着用着,我们会发现一个蛋疼的事实,因为mvp是通过接口的形式来互相通信,那么就无法避免地要额外写多个接口。通常,一个Activity就对应着一个View、一个Presenter和一个...

2019-04-16 16:09:18 347

原创 深入理解动态代理

Java的动态代理相较于代理的思想更向前迈进了一步,因为它可以动态地创建代理并动态地处理对所代理方法的调用。在动态代理上所做的所有调用都会被重定向到单一的调用处理器上,它的工作是揭示调用的类型并确定相应的对策。一个简单的动态代理的例子:public class ProxyTest01 { public static void main(String[] args){ Syst...

2018-09-22 16:08:12 326

原创 深入理解枚举

枚举是java SE5中新增的特性,关键字enum可以将一组具名的值的有限集合创建为一种新的类型,而这些具名的值可以作为常规的程序组件使用。我们知道,在android中应避免使用枚举,尽量用静态常量来代替枚举的使用,为何?有人会说了,因为枚举占用更多的内存。那为何枚举就比景太常量要占用更过的内存呢?首先,我们来创建一个简单的枚举类EnumTest:public enum EnumTe...

2018-09-21 17:51:02 252

原创 组件化爬坑---RxJava2+Retrofit2+Okhttp封装

在公司组件化开发中,让我很头疼的就是网络层的交互了,由于历史原因,我们的网络封装与业务耦合度很高,拆分起来比较头疼,没办法,既然要做组件化,只能耐着性子慢慢拆分。切入正题,我们的项目网络请求使用的是RxJava2+Retrofit2+Okhttp,为了将网络模块单独抽出来以适应三个端的调用,就得让网络层与业务层完全隔离。这里介绍我目前对网络层简单实用的封装,网络请求就一个类Httpclie...

2018-08-22 19:08:20 975

原创 组件化爬坑---组件间解耦之ARouter获取Service

上一篇我们介绍了ContentProvider应用组件间通信,相信了解过组件化开发的同学肯定也知道阿里的Arouter框架,它是为组件间通信而生的。今天我们不说它如何实现Activity、Fragment跨组件跳转的,来说说它用于Service获取的应用,其中主要依靠ARouter中的Iprovider来实现的。如何实现?同样的,Module A、B都引用了lib_common组件,A...

2018-08-21 20:28:36 4732

原创 组件化爬坑---组件间解耦之ConentProvider

上篇文章介绍了Serviceloader在组件间数据传递的应用,这次我们来看看ContentProvider怎样应用在组件化开发中。我们知道,ContentProvider作为Android四大组件之一,常用来跨进程通信。只要我们设置ContentProvider的exported =true ,就可以对其他应用暴露自己的数据获取接口,利用这一特性,我们就可以将其利用在组件间的数据通信了。...

2018-08-21 20:10:17 645

原创 组件化爬坑---组件间解耦之ServiceLoader

1.ServiceLoader定义ServiceLoader是Java API中服务提供者的加载设施,这里的服务是熟知的接口和类(通常是抽象类)的集合,服务提供者是服务的特定实现,提供者中的类实现接口,并子类化在服务本身中定义的子类。2.ServiceLoader作用在工程内或者跨工程通信,怎么说呢?直接看例子:Test01、Test02服务都实现了IMyServiceLoad...

2018-08-14 20:20:16 1610

原创 组件化爬坑---ButterKnife的使用

想必大家都知道在组件化开发中如何使用ButterKnife,简单说明如下:1.在最外层的build.gradle中引入butterKnife插件:2.在对应的module下的build.gradle的dependencies中引入对应的butterknife:3.在library中使用控件绑定时,使用R2替代R:一切看起来貌似很正常,但我在组件化开发中却遇到了在libr...

2018-08-08 18:51:29 1977 1

转载 原码、反码、补码

出处:http://www.cnblogs.com/zhangziqiu/原码, 反码, 补码 详解本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法. 论证部分如有不对的地方请各位牛人帮忙指正! 希望本文对大家学习计算机基础有所帮助!一. 机器数和真值在学习原码, 反...

2018-03-27 16:05:10 290

原创 我的设计模式之旅-观察者模式

1.观察者(发布-订阅)模式定义在对象之间定义了一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象会收到通知并自动更新2.应用场景当多个对象需要及时获取对象A的状态时,通过A的订阅方法订阅它,然后当A状态发生变化时通过其通知方法通知到各个订阅它的对象。3.实现原理其基本实现原理是 接口回调。4.代码实例:定义观察者接口/** * 观察者 * @author huolala-sunyan...

2018-02-23 16:58:05 238

转载 Java中<? extends T>和<? super T>的理解

文章转自:http://blog.csdn.net/jdsjlzx ? 通配符类型- <? extends T> 表示类型的上界,表示参数化类型的可能是T 或是 T的子类;<? super T> 表示类型下界(Java Core中叫超类型限定),表示参数化类型是此类型的超类型(父类型),直至Object;12上界<? extends T>不能往里存,只能往外取比如,我们现在定

2017-12-20 19:15:30 462

原创 我的设计模式之旅-builder建造者模式

何为builder模式当我们通过构造方法来创建一个类时,往往需要传入一些列参数,这本无可厚非,但如果这个类的构造参数较多,并且涉及到稍复杂的业务,而这些业务逻辑是由构造方法传入的参数按照一定的逻辑搭建起来的,这个时候我们如果直接通过构造函数来获取对象的话,就很难了解这一些列参数的意义了。因此,通过内部类Build来管理这一系列参数,并且由它来生成类对象。实例代码如下:public class Per

2017-12-20 14:53:32 230

转载 Android热修复技术选型——三大流派解析

Android热修复技术选型——三大流派解析

2017-12-05 11:57:06 225

原创 插件化开发之-Ant分包

之前我们写过关于gradle分包的文章,它依靠MultiDex实现,主要用于AndroidStudio开发。而Ant分包一般用于Eclipse开发,通过改写编译脚本命令实现分包。Ant分包实现步骤下载Ant,如果eclipse里面有集成的就忽略。通过Ant命令编译android工程,编译完成后会生成一个build.xml自定义一个custom_rules.xml文件,通过改写target命令,

2017-12-05 10:47:28 393

原创 插件化开发之-gradle分包

插件化开发的由来android5.0之前,dalvik采用了一个short型数据来表示一个dex所含有的方法数个数,而short类型最大值为65535,因此方法数最大为65535.随着项目的不断增大,当项目中的方法数超过dalvik所能识别的最大方法数时,编译就会失败,为了解决这个问题,插件化开发就诞生了。何为分包?以下是没有进行分包的apk目录: 可以看到普通的apk目录中只含有一个clas

2017-12-05 10:21:44 697

原创 java多线程之-死锁

当两个或多个线程竞争试图获取对方持有的同步锁时,它们都会处于阻塞状态,除非某个线程主动释放自己所持有的同步锁,这时,死锁就出现了。用下面这张图很好理解: 如图,线程Thread1和Thread2都有两个同步方法Operation1()、Operation2(),Operation1()中会调用Operation2().当某个时候,Thread1获取了A的对像锁,然后失去了CPU时间片,Thre

2017-12-02 11:17:51 271

原创 java多线程之-同步

多线程中的同步问题当多个线程同时访问同一资源时,由于对资源的读写操作并不是原子性的,因此可能会出现同步问题。 比如下面这样:class MyThread implements Runnable{ int a = 100 ; @Override public void run() { // TODO Auto-generated method stub

2017-12-01 17:13:22 339 2

原创 java多线程之-线程创建方式

线程创建的几种方式继承Thread类public class Thread01 extends Thread{ @Override public void run() { //耗时任务 }}实现Runnable接口public class Thread02 implements Runnable{ @Overr

2017-12-01 12:15:41 218

原创 接口的多继承跟抽象类的多实现

1. 接口可以实现接口吗?起初一看到这个问题,我在想接口不就是用来实现的吗?然后写代码已验证,发现并不行,答案是:接口只能继承接口,并且可以多继承,接口继承接口并不需要必须继承父类接口的抽象方法,这样就可以避免类似多继承带来的问题。比如下面:public interface B extends C ,D{ final static int a = 1 ; void b();}pub

2017-12-01 11:58:19 1382

原创 内存泄漏分析之-内存分析工具的使用

知道了内存泄漏的种种原因后,我们想知道程序是否发生了内存泄露,并定位到内存泄露的具体位置应该怎么做呢?1.查看GC日志判断是否发生内存泄露程序每进行一次GC操作,Logcat中就会输出一次GC日志。日志格式如下: <GC_name>: <GC_Reason> <Amount_freed>, <Heap_stats>, <Pause_time>GC_name :运行环境,android4.4之前

2017-11-30 16:20:08 424

原创 Android内存泄露分析之-内存泄露的原因

首先我们要知道java运行时内存的分配策略,它们分别是:静态分配、栈式分配、堆式分配,而三种存储策略所对应的内存空间分别是:静态存储区(方法去)、栈区、堆区。静态存储区:主要存放static修饰的静态数据。这块内存在程序编译 时就已经分配好,并且在程序的整个运行期间都存在。栈区:主要存放方法体中的局部变量(包括基本数据类型、对象的引用),当所在的方法执行完毕后这些变量会释放所持有的内存。堆区

2017-11-24 23:09:19 344

原创 Andrid内存优化之你必须知道的核心类LruCache

提到内存优化,就会想到内存缓存,而提到内存缓存就必须得提到android提供的Lru缓存方案,它的核心就是LruCache类,因此,从源码的角度去看看它的工作原理。在android3.1.x(API 12)之前,我们用到的是android.util包下的LruCache,在此之后,我们可以用android.support.v4.util包下的LruChache,其实这两个包下的LruCache代码一

2017-04-20 21:46:35 315

原创 关于mac上refreshing gradle building 无限加载问题

自从google被墙,对于我们这些需要国外资源的猿来说,真的很蛋疼,尤其在我更新gradle时,曾经让我很抓狂。 我们在新建android项目、或者引入其他较高版本gradle项目的时候,肯定会碰到"refreshing gradle builing"之类的进度条,这个时候,我想每个人都会抓狂,好了,言归正传,就因为google被墙,导致androidstudio想下载与项目匹配的gradl

2017-04-13 22:22:49 546

原创 关于androidstudio更新gradle遇到的问题

自从google被墙,对于我们这些需要国外资源的猿来说,真的很蛋疼,尤其在我更新gradle时,曾经让我很抓狂。我们在新建android项目、或者引入其他较高版本gradle项目的时候,肯定会碰到"refreshing gradle builing"之类的进度条,这个时候,我想每个人都会抓狂,好了,言归正传,就因为google被墙,导致androidstudio想下载与项目匹配的gradle版本时

2017-04-13 22:13:47 1014

原创 关于java.lang.NoSuchMethodException: <init> [class android.content.Context, interface android.util.Att

在写自定义控件的时候遇到过这个异常,当初一直没搞清楚问题所在,起初代码如下:public class IndicatorView extends View { private Paint mPaint; private Path mPath; private float step = 1.0f; public IndicatorView(Context context)

2017-04-12 20:40:31 1812

原创 自定义控件之onMeasure解析01

好吧,为何要写这个系列的文章呢,因为最近看了一些源码,很多源控件都是自定义控件,因此有必要重新对自定义控件进行系统的学习。知识点:自定义控件一般继承View,也可直接继承已有的控件。不管哪种情况,核心思想还是按照:onMeasure->onLayout->onDraw这个步骤来。1.onMeasure()@Override protected void onMeasure(in

2017-04-12 20:04:51 372 1

原创 初识EventBus

什么是EventBusEventBus出来已经很久了,由于各种原因,之前一直没用过它,身边总有人说它好用,于是开始了它的学习。 EventBus,即事件总线,由开源组织GreenRobot发布。它利用更少的代码,更加精简的方式去使得Activities, Fragments, Threads, Services等组件得以通信。 用一张图来描述它的工作方式: EventBus用法1.定义事件:p

2017-02-22 17:45:45 389

原创 我的设计模式之旅-策略设计模式

先来说说为何我要学习设计模式,在上家公司工作期间,工作内容一般都是模块化,项目需要一个功能,我就添加一个功能,某一个功能需要改变,我就在代码上到处修改,这样就出现了一个问题,有些功能之前是有的,但现在不需要了,你就得手动去删除与之关联的代码;有些功能保留了,可有变化,你又得去手动修改与之关联的所有代码。这样不仅浪费时间,而且很容易造成bug。当时开发时,没少被老大批。想想还是因为自己编码知识停留在

2015-12-22 23:05:00 439

空空如也

空空如也

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

TA关注的人

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