- 博客(51)
- 资源 (1)
- 问答 (1)
- 收藏
- 关注
原创 robolectric完全解析
官网地址:http://robolectric.org介绍:在android设备上跑测试用例太慢了,编译、部署、启动app要花费很多时间。Robolectric是一个单元测试框架,测试是运行在jvm上的,只需要几秒钟。使用:在build.gradle中添加testCompile "org.robolectric:robolectric:3.4"android { testOptions {
2017-08-02 20:12:05
8661
原创 Robotium框架的使用和源码解析
使用:1、添加依赖androidTestCompile 'com.jayway.android.robotium:robotium-solo:5.6.3'2、添加测试代码,例如:@RunWith(AndroidJUnit4.class)public class MainActivityTest { @Rule public ActivityTestRule<MainActivity>
2017-08-01 20:46:58
826
原创 动态申请权限
官方文档中已经有了详细的介绍和使用说明 https://developer.android.google.cn/guide/topics/security/permissions.html#normal-dangerous下面是我的一些总结:1、为什么要动态申请权限?系统权限分为正常权限和危险权限。正常权限可以在清单文件中列出,系统会自动授予这些权限。对于危险权限,如果设备运行版本大于等于Andro
2017-07-26 16:27:07
532
原创 gradle中的依赖传递
依赖中的传递依赖怎么去除?1、查看依赖树./gradlew app:dependencies 如果提示zsh: permission denied: ./gradlew 错误,可以输入:chmod +x gradlew2、可以通过在gradle中配置,去除依赖compile('com.android.support:appcompat-v7') { force = true // 冲突时
2017-07-10 20:19:12
5574
原创 访问者模式
访问者模式(Visitor Parttern)属于行为模式,主要用于将数据结构和数据操作分离。使用时,在被访问的类中添加一个方法,通常方法的参数是访问者,这样可以将自身引用传入访问者。总而言之就是,被访问者提供可以访问自身的接口,访问者来操作数据,通过这样实现解耦。可以使用在在对象结构很少变化,对对象的操作经常变化场景中,比如报表统计,过滤器等等。一个访问计算机组件的demo:计算机的部件的接口,对
2017-06-30 11:28:22
262
原创 中介者模式
中介者模式(Mediator Pattern)式属于行为型模式。是用来降低多个对象和类之间的通信复杂性。:用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。比如:MVC 框架,其中C(控制器)就是 M(模型)和 V(视图)的中介者。一个简单的聊天demo:用户:public class User { private
2017-06-29 16:17:23
346
2
原创 状态模式
状态模式(State Pattern),属于行为型模式。允许对象在内部状态发生改变时改变它的行为,看起来好像修改了它的类。当代码中包含大量与对象状态有关的条件语句时就可以使用状态模式。可以将各种具体的状态类抽象出来,对象的行为依赖于它的状态(属性),所以状态改变而改变它的相关行为。也就是可以修改类的属性,属性改了,依赖于属性的方法也就改变了。非常简单的一个demo:包含State状态的类:publi
2017-06-28 18:18:04
253
原创 命令模式
命令模式(Command Pattern)属于行为型模式。这个模式将请求通过命令的形式封装成对象。用来将“行为请求者”与“行为实现者”解耦,这样用户只需要提出一个命令,而不用关心这个命令由谁实现。应用场景:比如要对行为进行“记录、撤销/重做、事务”等处理,这种无法抵御变化的紧耦合是不合适的,可以采用命令模式。命令接口:public interface Task { void execute(
2017-06-27 11:19:26
270
原创 桥接模式
桥接模式(Bridge pattern)属于结构型模式。是用于把抽象化与实现化解耦,使得二者可以独立变化。当一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。就可以用桥接模式。简单的demo:比如食物有牛奶,米饭,香蕉。我要吃饭就吃从这些食物中选。桥接模式可以将抽象的我要吃的那顿饭和实体的食物解耦。食物抽象类:public interface Food { void getFood(
2017-06-26 18:21:11
184
原创 解释器模式
解释器模式(Interpreter Pattern)属于行为型模式。意图是给定一个语言,定义它的文法表示,并定义一个解释器,这个解释器使用该标识来解释语言中的句子。一个简单的demo:当前的环境,用于存储当前环境下自定义变量的真假public class Context { private Map<Variable, Boolean> map = new HashMap<>(); //
2017-06-25 21:53:30
211
原创 模板方法模式
模板方法模式(Template pattern)属于行为模式,用于定义构建某个对象的步骤与顺序,或者定义一个算法的骨架。可以在一个抽象类公开定义执行它的包含执行顺序方法的方法,它的子类可以按需要重写方法实现。demo:游戏的模板抽象类:public abstract class Game { // 子类需要实现的方法 public abstract void startGame();
2017-06-24 15:38:56
237
原创 装饰器模式
装饰器模式(Decorator Pattern)属于结构型模式。用户向一个现有的对象添加新的功能,同时又不改变其结构。例如,现在有个Girl类,学习的是语数外。现在有的女孩也有学习其他特长,在不改变Girl类的情况下,添加学习舞蹈、唱歌、绘画等特长。Child抽象类:public abstract class Child { abstract void learn();}Girl类:pub
2017-06-23 21:32:51
231
原创 原型模式
原型模式(Prototype Pattern)属于创建型模式。用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。原型模式可以用来创建重复对象。java中通过实现Cloneable接口,重写clone方法实现。一个简单的浅克隆的demo:public class ProtoType implements Cloneable { private int num; public
2017-06-22 14:36:01
284
原创 外观模式
外观模式(Facade Pattern)属于结构型模式。用来向用户提供一个可以访问系统的接口。在用户调用和复杂系统之间再加一层,这一层用来将处理调用顺序和依赖关系。demo: 在开电脑和关电脑的时候,我们不需要知道电脑的内部结构,只需要按开关就可以了电脑中CPU、硬盘、网络的启动和关闭:public class Cpu { public void start(){ Syst
2017-06-21 11:10:18
204
原创 适配器模式
适配器模式(Adapter Pattern)属于结构型模式,他用于将一个类的接口转换成用户希望的另外一个接口。 在适配器模式中,我们可以定义一个包装类,包装不兼容接口的对象。demo: 机器人生产厂家想生产一个新产品,可以模仿狗叫,狗跑的机器人机器人接口:public interface Robot { void speak(); void move();}目前生产的机器人,代号
2017-06-20 19:38:46
216
原创 组合模式
组合模式(Composite Pattern),属于结构型模式,组合模式组合多个对象形成树形结构以表示“整体-部分”的结构层次。组合模式对单个对象(叶子对象)和组合对象(组合对象)具有一致性(统一的接口),在调用时可以忽略复杂的层次结构,使用统一的方式去操作层次结构中的所有对象。使程序能够与复杂元素的内部结构解耦。下面是一个操作文件夹的demo:文件结构: 文件接口:public abstract
2017-06-19 19:51:49
213
原创 享元模式
享元模式(Flyweight Pattern)属于结构型模式。主要用于减少创建的对象数量,来减少内存占用,提高性能。用法是将很多对象分为几类,确定每个类对象的唯一标示,可以用HashMap存储。简单的demo: 画很多圆的时候,不需要每个圆形都创建一个对象,假设创建不同颜色的画笔是一个很大的开销,就可以以颜色进行分类,一种颜色的圆形只创建一个对象。画图形的接口:public interface S
2017-06-18 20:46:33
253
原创 责任链模式
责任链模式(Chain of Responsibility Pattern)属于行为型模式。 在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。下面的demo为我们常见的log打印:定义Log责任链的接口:public abstract class Log { // log等级 public stat
2017-06-17 18:37:26
231
原创 迭代器模式
迭代器模式(Iterator Pattern)属于行为型模式。用于顺序访问集合对象的元素,而且不需要知道集合对象的底层结构。迭代器接口,定义了访问集合的两个方法public interface Iterator { public boolean hasNext(); public Object next();}获取迭代器的接口,所有集合要实现这个接口public interface
2017-06-16 18:09:30
213
原创 备忘录模式
备忘录模式(Memento Pattern)式属于行为型模式。他用来保存一个对象的某个状态,以便在适当的时候恢复对象。很简单的demo:记录对象的状态public class LastState { private String state; public LastState(String state) { this.state = state; } pu
2017-06-15 17:21:38
260
原创 代理模式
代理模式(Proxy Pattern)属于结构型模式,在程序中添加中间层,为象提供代理来控制对对象的访问。这种模式解决了直接访问对象带来的问题,例如买火车票不一定在火车站买,也可以去代售点,更加方便。例如,直接访问有些对象会产生很大的开销,我们可以加个代理层,节约性能。等等。demo:图像接口:public interface Image { void display();}真正的图像处理
2017-06-14 21:13:46
161
原创 策略模式
策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。这时候可以将这些不同的行为封装成一个一个的类,实现同一个接口,供在运行时会改变行为的类调用。demo:不同方法抽象出来的供外部调用的接口:public interface Strategy { void execute();}具体的方法:public class Stra
2017-06-13 19:56:26
157
原创 建造者模式
建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式。有一些复杂的对象他包含的基本部件不会变,而基本部件组合经常变化的时候,就可以使用建造者模式。常用的就是Builder的链式调用,demo:public class Meal { private boolean eatRice; private boolean
2017-06-12 20:37:10
774
原创 观察者模式
当对象间存在多对一的依赖关系时,可以使用观察者模式(Observer Pattern)。观察者模式属于行为型模式。概况的说就是:一个类(被观察者Observable)管理着所有依赖于它的类(观察者Observer),并且它状态变化时会主动给这些依赖它的类发出通知。自定义观察者模式的demo:观察者接口:public interface Observer { void update(Obser
2017-06-11 23:34:20
200
原创 工厂模式
工厂模式有三种:1、简单工厂模式(Simple Factory Pattern)简单工厂模式又称之为静态工厂方法,属于创建型模式。是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。eg:抽象类:public interface Car { void drive();}具体实现:public class Benz implements Car { @Ove
2017-06-10 01:15:45
210
原创 Java代码块
代码块:就是大括号{}中的代码,代码块是不能单独运行的,它必须要有运行主体。在Java中代码块主要分为四种:1、普通代码块在方法名后面用{}括起来的代码段,使用方法名调用它。public void test(){ System.out.println("普通代码块");}2、静态代码块用static修饰的用{}括起来的代码段,在类加载的时候执行,主要作用是初始化静态属性。static{
2017-06-09 12:18:14
250
原创 深入理解jvm — 类加载篇
概述虚拟机把Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的java类型,这就是虚拟机的类加载机制 Java语言里,类型的加载、连接和初始化都是在运行期间完成,使得java更灵活类加载时机类从加载进内存到卸载出内存,它整个的生命周期包括:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)
2017-03-13 20:15:47
237
原创 深入理解jvm — GC篇
java自动管理内存主要解决的两个问题:1、给对象分配内存,上篇博客已经介绍过了http://blog.csdn.net/ying1414058425/article/details/601415432、回收分配给对象的内存,下面我将一步一步的进行分析
2017-03-03 17:59:46
670
原创 深入理解jvm — 内存篇
虚拟机在执行java程序的过程中会把它管理的内存划分为若干个不同的数据区,运行时数据区包括5个部分:程序计数器、方法区、虚拟机栈、堆,下面将分别介绍
2017-03-03 16:08:13
320
原创 Android透明状态栏
先上代码: 透明状态栏:if (Build.VERSION.SDK_INT >= 21) { //只有5.0以上的系统才支持 View decorView = getWindow().getDecorView(); int option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN |View.SYST
2016-08-31 12:32:02
245
原创 我对androidannotations库的看法
最近才发现项目的代码中方法数已经有6万多,很吃惊,觉得项目貌似没有那么大,怎么会有那么多的代码量。但是我马上就想到了项目中用了androidannotation库,他会在编译时生成很多的代码。其实我本人特别讨厌使用这个库,虽然他没用反射,在编译时生成的代码,对效率也许没什么影响,并且感觉少些了一些findViewById,传参数啊,启动Activity啊之类代码。但是,我特别特别讨厌类后面还要加个_
2016-08-31 12:23:48
913
原创 android google mvp
google官方mvp demo的地址: https://github.com/googlesamples/android-architecture/tree/todo-mvp/下面对这个demo进行分析 先看一下\app\src\main\java目录结构 每一个页面都有一个文件夹,其中肯定包括4个类 Activity 管理Fragment, 建立Fragment和对应的Prese
2016-08-30 18:32:46
1105
1
原创 java多态
为什么要用多态? 就是为了方便指挥。 代码里也是需要调度的。多态其实就是一个智能化的体现,比如调用一个方法,不同对象会有不同的相应。 举个例子:山林里有很多动物,动物国王发布号令,“叫”。各种动物都会开始叫,至于叫声,每个动物都有自己叫法。怎么实现多态呢? 首先要有个父类,然后子类重写父类的方法。父类引用指向子类对象,这样用父类就可以发布号令了,不同的子类就可以做出不同的相应,从而实现多态。
2016-08-30 14:44:00
235
原创 java泛型
什么是泛型?在我理解,泛型就是多种类型中的一种类型。随便你是什么类型,java8有大基本类型和object,泛型就是其中任意的一个类型。为什么要用泛型?我们先想想不用泛型行不行?例如:List假如没有泛型,那就可以调用add方法,加入任何类型。加的时候挺爽的,取的时候怎么办?只能取出object,如果强转的话,或许就会报错。而你需要的是String类型,那要怎么办呢? 所以,泛型保证了我们存取数据
2016-08-29 19:23:03
357
原创 Android URLEncoder
bug: 发送http get请求的时出错Caused by : java.lang.IllegalArgumentException:Illegal character in query at index 70: ….原因: 在请求中我用到了不常用的字符,导致调用HttpGet(url)方法时,url参数解析错误解决方法: 所以如果法中这种问题,可以在调用下面的方法将参数加密URLEnco
2016-08-29 16:34:17
581
原创 SectionIndexer详解
package android.widget;/** * 接口可以被adapter实现,使AbsListView的sections之间可以快速滑动 * 一个secton是一群列表,有很多相似点,例如他们可能以相同的字母开头,或者是来自同一个歌手的歌曲 * ExpandableListAdapters认为groups和sections是同一个缩放组,应该返回一个合适的位置 * 可以看一下Abs
2016-08-10 10:55:59
2390
原创 android Looper源码分析
looper的主要作用:绑定当前线程,然后不断的在MessageQueue中去取消息,交给handler处理 下面会从源码中的各种方法着手,开始分析静态的loop()方法:
2016-05-12 17:10:22
395
TA创建的收藏夹 TA关注的收藏夹
TA关注的人