自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Android程序员的博客

个人学习交流博客,关于安卓,java的一些东西。23种设计模式,编程思想。项目中实用的一些代码,一些bug原因及修复

  • 博客(44)
  • 收藏
  • 关注

原创 安卓真正阴影实现

安卓界面开发中,常会遇到要阴影的情况。大部分我们用android:elevation或多层的Drawable来实现。但对于像素眼的UI来说,偏偏让我们更改阴影的颜色还要模糊度。一般我直接用“系统没有相关属性”怼回去,因为网上实在没找到现成好用的。但最近被逼无奈实现一个,跟大家分享下。 闲话少说,实现效果走一波: 这个布局叫ShadowRelativeLayout,从名字你就知道他继承谁...

2018-08-16 11:13:49 4802 2

原创 是时候干掉onActivityResult了

两个冤家,handler与onActivityResult安卓中有两个我们常用,但写起来非常不爽的代码。一个是handler,另一个就是onActivityResult了。他们非得让我们都整一个常量,而且看代码时请求和处理逻辑之间跳来跳去。一个字,晕。 我们知道handler大部分用在网络请求上,至于去掉可以看我以前的文章安卓项目易用Ohttp封装,当然这个网络请求封装很多。但对onActivit

2017-11-14 19:08:41 3079

原创 观察者模式与回调

在说观察者模式之前,我们来说一下回调函数。如小明想找小丽看电影,小丽不在家。小丽妈妈接的电话,于是小明说小丽到家了告诉他。实现如下:public class Observer { public interface Watcher { public void update(); } public static class 小丽妈妈{ private

2017-09-21 16:49:24 2886

原创 策略模式与机制

在说策略模式之前,我们首先要说下Unix/Linux的接口设计有一句通用“提供机制而不是策略”的格言。 什么是策略,策略有点像战术是具体的东西。而机制像战略是目的。 通俗来说机制是做什么,策略是怎么做。public class Strategy { // 抽象策略 interface EatStrategy { void eatFood(); } s

2017-09-21 13:38:59 2951

原创 六种线程安全的单例模式

单例模式怕是很多程序员使用最多的设计模式了,面向对象的23种设计模式点这里。废话不多说,直接上代码:public class Singleton { //1.懒汉型 private static Singleton instance; private Singleton (){} public static synchronized Singleton g...

2017-08-16 18:31:34 5562 2

原创 面向对象的23种设计模式

首先呢,设计模式是针对面向对象来的。再说设计模式之前我们先来说一下六大设计原则。 首先最基础的开闭原则:对扩展开放,对修改关闭。 为啥这是最基础的,因为我们都知道软件是要改的。对扩展开放保证了可以增加功能,像泛型啦这些。对修改关闭保证了像前的兼容性,jdk7兼容jdk6这样。所以开闭原则围绕软件的整个生命周期。在说其余五个之前我先说一下程序设计的模块内高内聚,模块间低耦合,其实把类看成一个模块,结

2017-08-16 15:42:34 9822

原创 自定义dialog简单封装

自定义 dialog,简单代码封装

2017-08-14 15:59:49 6617 2

原创 flutter自定义页面路由动画

相信很多android的小伙伴都听过flutter了,甚至很多已经开始使用flutter了。但一般使用flutter都是用MaterialApp,然后像下面这样跳转:Navigator.push(context, new MaterialPageRoute(builder: (BuildContext context){ return new SecondPage();}));那么我们怎...

2019-11-25 12:54:00 719

原创 从https看认证和加密

HTTPS(Hyper Text Transfer Protocol over SSL)为啥要有HTTPS有人说我HTTP用的很好,为啥要HTPPS。还得搞服务器,还得申请证书的。是的,为啥呢?大家都说过悄悄话吧,首先防止的要是旁边有人或者隔墙有耳。一般吐槽上司鄙视同事的话还好,但像古代谋反啥的可能要用到加密和认证技术了。认证是不让第三个人听到,加密目的是听到也不知道我们说的啥。认证相必...

2018-10-31 15:56:24 3108

原创 未来是xml还是json的?

xml:可扩展标记语言从名字就知道他是从html来的,为了解决html的扩展性。所以html的解析工具可以直接拿来用,像很多选择器也是衣来伸手。所以工具支持要很强大。json:JS 对象简谱从这个名字我们也知道它的主战场在Javascript,json和JS对象完全无缝连接。转成对象后我们操作属性要比xml的查询自然强些。双方样例{ //json "id": 123,...

2018-08-30 10:34:52 380

原创 三张图弄懂MVC、MVP、MVVM

MVC模式:注意这里的箭头是单向的,单向的,单向的。优点:只具有单向的操作流,数据驱动。整个世界都清晰了。缺点:view监听Model较多,不可重用。controller不易于测试。MVP模式:所有操作都通过Presenter,Presenter,Presenter。优点:易于测试。view可重用。缺点:presenter不仅有业务逻辑,还要手动...

2018-08-22 18:06:44 665 1

原创 安卓线程安全

UI线程安全耗时操作不在UI线程,否则会引发NAR,影响用户体验UI非线程安全,不在其他线程操作UI。 既然像网络操作这种耗时的操作不能在主线程,而其他线程又不能更新UI。于是安卓提供了Handler和Looper。可一个看到一个线程只能有一个Looper和MessageQueue。既然是队列也就是先进先出的顺序结构,由Looper一个个取出。还可看成handler在外面,也就是一...

2018-07-16 16:20:07 1467

原创 Java线程安全相关理论

多线程原因说线程产生的原因之前,我们先说进程的产生。我们都知道刚开始电脑特别大,而且特别贵,最主要还特别慢,那时的cpu速度和外面的硬盘速度差不多。但人们对速度的追求是无情的,随着cpu的频率奔跑,于是硬盘明显跟不上,于是有了内存做缓存。有了内存有人想同时执行多个任务,因为单个任务老是会因为等IO中断浪费时间,于是把任务保存在内存里。便有了多进程。可以在等IO的时候执行另一个任务。 线程同理...

2018-07-03 15:37:16 517

原创 安卓项目易用Ohttp封装

在android中的网络请求如果用Handler来传,看代码跳来跳去太累。首先呢,这个是我实际项目中的封装,各位不用担心能不能用的问题。支持的功能:1.无缝在主线程调用回到主线程 2.自动Gson泛型机械,并支持到二级泛型 3.支持Activity结束时,取消所有创建的网络操作 4.支持单个网络操作取消 5.使用链式调用,使用方便Get请求HttpUtil.newBuilder(this)/

2017-11-09 16:20:59 1970

原创 安卓优化之SparseArray易懂详解

SparseArray是对hashmap<int,E>的内存优化。它怎么优化的呢,为什么呢。因为知道怎么优化的之后,我们就能更好的理解它的方法和使用它。下面我们从遍历,赋值,遍历体现优化的莫过于它怎么遍历的://可以看到有从零到Size的index。for (int i = 0; i < sparseArray.size(); i++) { int key = keyAt(i);

2017-11-09 14:21:50 2571

原创 解释器模式

这是设计模式最后一篇,迟迟没有写。听到这个名字可能会想到解释型语言,学习编译倒也可以参考一下这个。这个在实际工作中用的很少,直接上实现加减乘除的代码吧public class Interpreter { interface Expression { int interpret(Context context); } //终结符表达式(Terminal Expre

2017-11-01 10:32:07 1697

原创 中介者模式

中间人模式也叫中介模式,听名字就应该知道的差不多了。下面例子中张三李四中间就有个中间人,代码如下:public abstract class Mediator { public abstract void contact(String content, String name); public static class Colleague { protected Str

2017-10-17 15:34:18 1666

原创 访问者模式

访问者模式,很多人认为是最难的一种设计模式。我觉得是名字没起好。我们先换个名字,不如叫它读者模式,我们知道一千个读者有一千个哈姆雷特。也就是说同一个对象,不同的读者会有不同的操作。代码如下:public class Visitor { abstract static class Element {//抽象的书 public abstract void accept(IVisi

2017-10-17 10:26:25 1679

原创 状态模式

生活中大部分东西都用容易变的和不容易变的,容易变的我们叫这个东西处于某种状态。比如人睡觉时你不要吵醒他。有时候某种状态影响对象整个的外部表现:像水和冰给人感觉就不是一个东西了,这时候我们就可以用状态模式了:public class State { public interface IWaterState { void printState(); } public s

2017-10-13 16:34:05 1445

原创 备忘录模式

备忘录模式也叫快照模式。在我们使用画图或ppt等办公软件时,常要撤销一些操作,这也是这个模式存在的最主要原因。代码如下:public class Memento {//这个模式为了恢复到以前的某个状态 static class Originator { private String state = ""; public String getState() {

2017-10-13 16:24:34 1722

原创 命令模式

命令,我们知道有命令、命令者、和被命令者。代码如下:public class Command { //命令模式 本来很简单的一句话的事为啥要整个模式,这个模式最主要的是命令者和被命令者的分离 public interface command {//命令接口 void exe(); } public static class MyCommand imple

2017-09-28 18:28:36 1454

原创 责任链模式

说责任链之前,我们先来说责任。责任就是一件事情由谁处理,出了问题由谁负责。无论公司还是政府,都是层层管理的,上面不处理就交给下面。就形成了一个责任链条, 现在的触屏设备的点击事件也是一样。一般都采用责任链模式,大控件不处理就转给小控件。代码如下:public class ResponsibilityChain { public static abstract class Widget {

2017-09-25 11:36:19 1518

原创 迭代器模式

迭代模式就是提供一种遍历方式,像list、set等都实现了迭代模式。我们下面实现对String字符的遍历:public class MyIterator { interface iterator { Object next(); boolean hasNext(); } static class MyString implements iterat

2017-09-25 09:00:08 1399

原创 模板方法模式

我们做一些事情都有一个步骤,而相似事的步骤是一致的。就拿我们打10086来说,有人查余额和有人要人工服务,但他们的不知都分下面三步:拨号、选择服务、评分。这种最适合用模板方法,实现如下:public class TemplateMethod { //模板抽象方法 public abstract static class Template10086 { //1.拨打10

2017-09-21 15:11:25 1421

原创 组合模式

这里的组合模式不是”组合好于继承”的组合,那么是什么组合呢,我们来看代码:abstract class Component { String name; public Component(String s){ this.name=s; } public abstract void add(Component c);

2017-09-11 21:06:58 1481

原创 享元模式

享元模式听名字就知道是共享一个东西,为了节省内存嘛。那么它和单例模式有什么不同呢?单利模式就一个对象,而享元模式是一组对象,共享的是相同的对象。没错,我们的String就用的享元模式,下面我们代码实现:public abstract class Flyweight{  public abstract void operation(); } public class Concre

2017-09-11 20:34:41 1465

原创 桥接模式

因为这个模式网上有很多不恰当的例子,这里先引用百度百科的定义:桥接模式是将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interface)模式。 所以说桥接模式就是接口模式,一方调用接口,一方实现接口。还是百度上的示例代码:public class Abstraction{/* Fields */

2017-09-11 20:18:16 1506

原创 外观模式

这个是比较好理解的,拿我们的电脑做例子。电脑有cpu,内存,显卡等这些。当电脑开机时,主板、cpu、内存等都要启动。但作为用户并不需要管里面启动顺序之类的,我们只要按下开机键就行了。public class Facade { public static class Board { public void start(){ System.out.print

2017-09-04 15:21:10 1463

原创 代理模式

代理模式和装饰器模式实现起来很像,那他们的区别在哪呢。我喜欢从名字上分析,装饰只是加点东西,而代理是全权的。所以装饰改的是一个接口的方法(当然装饰可以嵌套),而代理是所有的方法(当然java动态代理只能更改有接口的)。代理分为静态代理和动态代理,下面上静态代理代码:public class Proxy { interface Draw { String draw();

2017-09-01 17:20:45 1487

原创 装饰器模式

装饰器模式,听名字就知道是在原来的上面加点东西,面向对象的23种设计模式点这里。废话少说,我们把圆球图上颜色。上代码:public class Decorator { public interface Color {//颜色接口,可返回任意颜色 String draw(); } public static class RedColor implements Co

2017-08-30 16:15:28 1686

原创 两种适配器模式

说到适配器,我想我们接触最多的叫电源适配器。没错,所有的手机充电器都是电源适配器。从交流变直流,从220v到5v。而适配器模式分为两种,一种是类适配器,一种是对象适配器。下面先写类适配器:public class Adapter { static class HomePower { public String homeRequest() {

2017-08-24 18:08:11 1910

原创 建造者模式

建造者模式使用的也是比较多的设计模式,public class Computer { private String cpu; private String screen; private String disk; private Computer() { } @Override public String toString() {

2017-08-22 10:15:28 1624

原创 抽象工厂模式

上一篇写了简单工厂和工厂方法,简单工厂和工厂方法点这里,面向对象的23种设计模式点这里。我们还用上词美女的例子,直接上代码:public class Factory {//抽象工厂模式,还是一个类。觉得适合看的人拷过去运行修改 abstract static class 美女 { 身材 身材;//这里为了简单,我们感兴趣的只是身材 void 美女(){

2017-08-21 14:13:05 1632

原创 工厂方法模式

我们在看一些源码时经常会看到xxxxFactory,这就是工厂模式了。面向对象的23种设计模式点这里。说工厂模式之前先说个段子:有个单身的java程序员,过年回家晚上睡着了。父母看着独生的儿子就着急说“你看也不小了,这没有对象怎么办”,程序员在梦中“随便new 一个”。这个怕是不好new,所以我们要找今天的婚姻介绍所:工厂模式。废话不说,代码伺候:public class Factory {//简单

2017-08-18 17:27:29 1949

原创 原型模式的深浅复制和序列化

这是java的Object直接有方法的设计模式,面向对象的23种设计模式点这里。我们要做的只是实现Cloneable接口,这个接口的目的只是告诉jvm这个类的对象可以clone。同样的还有Serializable接口,今天说的跟它也有关系。下面回到题目,复制和clone相信大家都知道。就是弄个一模一样的,而那个模子就叫原型。那么什么是深复制和浅复制呢?这和对象实现有关系,对象里的属性有基本类型和引用

2017-08-17 15:19:24 2082

原创 java的jdk动态代理简单封装

首先什么是代理呢,代理就是你可以办一件事,而你不办,交给另一个人办。因为被代理人在办这件事前或事后,知道多做一些其他工作。至于静态代理和动态代理,只是实现方式不同。具体点这里 一般java的动态代理有两种方式,一种是jdk,一种是cglib。有人说cglib比jdk快,其实随着jdk7,jdk8对reflect的优化,jdk已经赶超了cglib。当然cglib可以代理任意方法是长处。下面是对jdk

2017-08-14 18:11:35 1600

原创 程序员的自我修养

如题所述,这是一个关于好程序员的故事。那么什么样的程序员叫好的程序员呢,我们这里之谈技能方面。那这就好办了,好程序员就是写的好代码的程序员。对吗?对不完全对,因为忽略了程序员的一个重要特性,就是改bug和在改bug的路上。于是我们得出好程序员就是产生最少的bug和最快的改好bug。一。产生最少的bug 1.最简单的实现功能:这个道理简单,代码越少bug越少。先不考虑优化、性能这一切东西,也不要用自

2017-08-04 11:19:39 2961

原创 android studio NDK demo详解

1,首先,要有android studio 2.2及以后版本。 2,生成NDK的demo,点这里 3,如果你成功运行了项目,那么应该猜的差不多了,那个native-lib.cpp就是一个c++文件,Cmake是c++的编译器。下面代码的意思也就是根据cMakeList.txt编译native-lib.cpp,当然是gradle帮我们调的cmake。 externalNativeBuild

2017-04-12 16:58:48 1533

原创 安卓内存分析实例

上一篇说了,内存分析的基本思路。没看的点这里 但只是说,不通过实践毕竟理解不深。这篇通过我在工作中遇到的一个实例来说一下具体的操作。正如上篇所说的,我给应用加了LeakCanary后检测到了内存泄漏,而没有分析出原因。这时我就用Android Monitor来分析具体哪出错了。dump内存的.hprof文件后,我们直接点击右侧的Analyzer Tasks(直接帮我们分析出泄漏的acivity),结

2017-01-20 11:58:40 1482

原创 java垃圾回收与安卓内存分析

首先,我们来说说内存泄漏与内存溢出。我们知道程序运行过程中会产生很多的对象,而有些对象用过之后就不用了。这时候就要对其所占的内存进行释放。如果释放不了,这就造成了内存泄漏。而当多次创建这种对象,这时候内存一直涨超过安卓app可拥有的最大内存就会产生内存溢出。所以,内存溢出和内存泄漏没必然关系。正常情况导致的内存溢出我们就不说了,我们要研究的是内存泄漏,不管它有没有溢出。追究内存泄漏的根源在于对象没有

2017-01-18 18:07:59 1911

空空如也

空空如也

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

TA关注的人

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