自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

商明超的专栏

https://franksblog.top | https://github.com/shangmingchao

原创 Android性能优化详解

启动优化用户都希望点击应用图标后,应用能够快速地启动并响应用户操作。而随着业务逻辑的增加,要初始化的操作越来越多,尤其是第三方组件的初始化,而在应用启动时初始化会导致应用启动时间变长,因此,我们需要对启动性能(Launch-Time Performance)进行优化。启动时的状态应用会从冷启动(cold start)、热启动(warm start)、温启动(lukewarm start

2017-12-08 21:02:09 691

原创 Glide v4详解

简介下载配置使用简单使用高级用法RequestOptionsTransitionOptionsGenerated APIRequestBuilderConfiguration使用技巧Glide的图片变换TransformationsGlide的过渡动画TransitionsGlide的缓存管理Caching简介Glide项目于2012年12

2017-10-12 20:43:25 9567 2

原创 RxJava2详解(三)--调度器

RxJava2 调度器(Scheduler)ReactiveX最重要、最核心的是对线程调度的封装。这依赖于subscribeOn和observeOn两个操作符和各种强大的Scheduler。 RxJava借鉴了Iterable/Iterator模式的思想,定义了一套Scheduler/Worker API。RxJava的Scheduler不进行任何调度的工作,但它负责创建Worker,Worker负责实际调

2017-09-18 16:34:36 1043

原创 RxJava2详解(二)--操作符

简介Observable和Observer只是ReactiveX的开始,他们自己只不过是标准观察者模式的轻微扩展,更适合处理事件序列而不是单个回调。 ReactiveX真正强大的是那些让你可以随意变换、组合、操作Observable发射的数据序列的操作符(Operators),这些操作符可以让你声明式地组合异步序列,同时具备回调的所有效率优势,但没有传统异步系统的嵌套回调处理的缺点。

2017-06-24 22:37:27 3703

原创 RxJava2详解(一)--基础

ReactiveX详解 RxJava2基础 RxAndroid ReactiveX(Reactive Extensions),一般简写为Rx,是一个使用可观察数据流进行异步编程的编程接口。由微软的架构师Erik Meijer领导的团队开发,Rx是一个编程模型,目标是提供一致的编程接口,帮助开发者更方便地编写异步和基于事件的程序,现在已经有了RxJava、RxJS、Rx.NET、RxScala、RxClojure、Rx

2017-06-13 16:53:25 9697

原创 Android权限管理详解

概述Android安全架构规定:默认情况下,任何应用都没有权限执行对其他应用、操作系统或用户有不利影响的任何操作。这包括读写用户的私有数据(如联系人或电子邮件等)、读写其他应用的文件、执行网络访问、使设备保持唤醒状态等等。 如果要使用这些受保护的设备功能,首先要在应用的清单文件(AndroidManifest.xml)中添加一个或多个 <uses-permission>标记: <manifest

2017-04-21 17:09:45 15919

翻译 Dagger2 User's Guide(翻译)

概述依赖注入(dependency injection)是一个对象为另一个对象提供依赖关系的技术手段。简单点说,就是一个对象(client)要依赖其它对象(services)才能完成工作,那么这个对象(client)就对其它对象(services)产生了依赖,而依赖注入就是把依赖(services)在需要的时候自动传给client,而不是client自己创建或者寻找services。也就是说客户对象

2017-03-30 16:07:14 3181

原创 Android软键盘输入详解

IM(Input Method): 输入法。是指通过键盘等输入设备输入 输入设备上没有 的字符的 方法/程序/处理器 。最开始是特指在拉丁字母键盘上输入CJK (Chinese, Japanese and Korean)文字的方法,现在一般将所有的输入语言的方式都叫输入法。 IME(Input Method Editor): 输入法编辑器。通常简作输入法。 IMF(input method

2017-01-22 17:53:26 3122

原创 Android时间处理详解

Android时间详解 Java Calendar详解 Java Date Greenwich:格林威治/格林尼治,是位于伦敦市中心东南部的一个区,1675国王查理二世在此建立了皇家格林尼治天文台,1851年御用天文学家艾里在天文台设置了中星仪并确定了格林威治子午线,1884年在美国华盛顿特区举行的国际本初子午线大会上正式将此线定之为经度的起点。

2016-08-25 12:14:17 4632 1

原创 MD风格之丰富多变Toolbar

一. 下载 compile 'com.android.support:design:23.4.0'二. 详解CoordinatorLayout继承自ViewGroup,实现了NestedScrollingParent接口,可以说是超级版FrameLayout。 CoordinatorLayout的用途主要有两个:作为最顶层的application decor或者chrome layout.

2016-07-22 15:58:40 1480

原创 Invalid double崩溃分析

Caused by: java.lang.NumberFormatException: Invalid double: "0,3" at java.lang.StringToReal.invalidReal(StringToReal.java:63) at java.lang.StringToReal.initialParse(StringToReal.java:164) at java.la

2016-06-18 14:58:22 5474

原创 RecyclerView之ItemDecoration详解

关于RecyclerView的ItemView装饰,之前一直用官方Demo的DividerItemDecoration,并没有认真地去理解ItemDecoration的用法,也没能体会到ItemDecoration的强大,直到要用到横向的RecyclerView,而且最左边的和最右边的Item要留出间隔(虽然clip结合padding可以实现),才认真地理解一下ItemDecoration。 Re

2016-05-20 16:11:39 14372 18

原创 Collections.sort()崩溃分析

对List排序一般采用两种方法:(1)实体类实现`Comparable<T>`接口,完成`compareTo(T o)`方法。(2)创建一个`Comparator<T>`的实现类,完成`compare(T o1, T o2)`方法,然后利用这个比较器对List进行排序。

2016-05-19 11:21:44 7141

原创 Glide使用详解(二)

BitmapPoolDalvik和ART都没有使用compacting garbage collector垃圾回收模式,这种模式中GC会遍历堆,同时把活跃对象移到相邻内存区域,让更大的内存块可以用在后续的分配中。因为安卓没有这种模式,就可能会出现被分配的对象分散在各处,对象之间只有很小的内存可用。如果应用试图分配一个大于邻近的闲置内存块空间的对象,就会导致OOM崩溃,即使总的空余内存空间大于要分配的

2016-04-17 15:01:59 8256 5

原创 Glide使用详解(一)

Glide使用 Glide使用教程 Glide详解 Android图片加载 一. 下载在build.gradle中添加依赖: compile 'com.github.bumptech.glide:glide:3.7.0'需要support-v4库的支持,如果你的项目没有support-v4库(项目默认已经添加了),还需要添加s

2016-04-12 12:25:23 158629 67

翻译 Glide之后台线程加载及缓存资源

后台线程加载及缓存为了使后台线程加载和处理媒体资源更容易,Glide新增了两个API:downloadOnly(int, int)into(int, int)Glide的downloadOnly(int, int)API允许你下载图片的字节流到磁盘中,以便你之后用到。你可以在UI线程中异步地使用downloadOnly()或者在后台线程中同步使用,但要注意,异步API需要一个Target作为参

2016-04-04 22:45:10 10317 2

翻译 Glide之Target

Glide不但可以把图片、视频剧照、GIF动画加载到View,还可以加载到自定义的Target实现中。Target就是使用Glide获取到资源之后资源作用的目标,我们通常是用Glide加载完资源后显示到ImageView中,这个ImageView就是目标。 Target架构的接口包括:com.bumptech.glide.manager.LifecycleListenercom.bumptec

2016-04-01 17:36:20 9466 6

翻译 Glide之GlideModule

GlideModule接口:为了延迟配置Glide(包括用GlideBuilder设置选项,为Glide注册ModelLoader) 所有的GlideModule实现类必须是public的,并且只拥有一个空的构造器,以便在Glide延迟初始化时,可以通过反射将它们实例化。注册ModuleLoader时可调用Glide的register(Class<T> modelClass, Class<Y> r

2016-03-31 15:13:49 14856 3

原创 Unable to add window崩溃分析

显示Dialog时,我们通常会将Activity实例传给Dialog,然后调用Dialog的show方法显示。但在一些情况下,比如说先通过异步网络请求请求数据,等拿到数据后再调用Dialog的show方法显示Dialog来告诉用户已经拿到数据了,但是,我们偶尔会发现发生这样的程序崩溃:android.view.WindowManager$BadTokenException: Unable to

2016-03-21 17:49:10 17665 2

原创 重学Java系列(一) -- static、final

static 修饰 类:static修饰类时,是指修饰内部类,也就是所说的静态内部类,普通外部类是不允许用static修饰的。非静态内部类可以直接访问外部类的成员变量和成员方法,即使是private的。实例化非静态内部类时要先实例化一个外部类对象outerObject,通过这个外部类的对象来实例化:NonStaticInner nonStaticInnerObject = outerObject.new NonStaticInner();非静态内部类将持有外部类对象的隐式引用,如果你用不到这个引用,那这个

2016-01-24 17:22:16 1120

原创 Android基于Bmob群聊功能的实现

Bmob算是国内做的比较好的做BaaS或MBaaS服务的公司了,官方写的IM的Demo目前可以实现登录注册、搜索添加好友、与好友进行文字图片音频位置对话功能,但感觉好友很多缺陷,比如说删除表中的数据时只能根据ID查找,没提供数据库事务操作的接口,IM没实现群聊的功能,有些API太少太局限,可能因为公司团队小吧,希望能越做越好。 回到正题,既然Bmob的IM没有实现群聊,那就自己实现,Bmob有一个

2016-01-20 15:41:34 4812 18

原创 Android仿QQ长按删除弹出框

废话不说,先看一下效果图: 对于列表来说,如果想操作某个列表项,一般会采用长按弹出菜单的形式,默认的上下文菜单比较难看,而QQ的上下文菜单就人性化多了,整个菜单给用户一种气泡弹出的感觉,而且会显示在手指按下的位置,而技术实现我是采用popupWindow和RecyclerView来实现,上面一个RecyclerView,下面一个小箭头ImageView。

2015-12-10 22:51:31 12414 64

原创 Bootstrap之侧边导航菜单(可折叠分组)

效果图: 源码:<!DOCTYPE html><html lang="zh-CN"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device

2015-11-10 18:09:09 126098 13

原创 Bootstrap之表格checkbox复选框全选

Bootstrap中表格的复选框全选

2015-11-10 16:23:53 82129 19

原创 Android自定义ViewGroup工具类ViewDragHelper分析

ViewDragHelper,包含在android.support.v4.widget包中。View,Drag,Helper,字面意思很直观地表明了它是一个视图拖动辅助类,封装了View拖动所涉及的触屏事件检测、View属性更改以及接口回调等的实现。ViewDragHelper是为定制ViewGroup而封装的的实用工具类(utility class,是一个类定义了一组通用的、经常使用的方法),ViewDragHelper类提供了很多有用的操作和状态跟踪以便用户在父ViewGroup范围内对View进行拖动

2015-11-05 08:35:20 1879

原创 前端基础与CSS中的浮动

HTML元素分为五种:① 空内容元素(Void elements) 没有内容,也没有结束标签。 area, base, br, col, embed, hr, img, input, keygen, link, menuitem, meta, param, source, track, wbr② 原始文本元素(Raw text elements) 可以有文本内容。

2015-10-13 12:13:00 1025

原创 设计模式笔记(十一)--建造者模式、原型模式、单例模式

建造者模式(Builder Pattern)封装一个产品的构造过程,并允许按步骤构造。还有一个通俗的定义是:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。简单点说,就是客户类想要创建结构或者逻辑特别复杂的产品对象时,让建造者帮忙构建产品,建造者负责产品各个部件的构建以及最终产品的组装。

2015-09-28 09:42:16 1063

原创 Tiles3.x框架使用

官网:http://tiles.apache.org/ Tiles,瓷砖,就像Windows8+的磁贴一样,多个瓷砖构成了整个UI页面。它是一个免费开源的模板框架,基于组合模式来简化UI界面的开发。对于复杂的网站来说,它可以简单优雅地结合MVC技术一起工作。配置: ①引入相应的依赖文件

2015-09-23 11:02:24 2804

原创 JavaScript总结(一)

JS数据类型:js究竟分为哪些类型是个比较蛋疼的问题,ECMAScript规范(JS遵循ECMA262规范)虽然总是统称为types,但有时也无法回避描述true、false、0-9这类数据时该用什么术语,如果非要分开,我觉得应该分为以下类型,原语类型/基本类型(Primitive Type):String、Boolean、Number、Undefined、Null。对象类型/引用类型(Object Type):Object。

2015-09-08 16:58:12 785

原创 Android Activity 启动模式和生命周期笔记

        官方文档地址:http://developer.android.com/guide/components/tasks-and-back-stack.html        一个应用程序通常包含多个Activity,每个Activity被设计用来让用户执行特定的action,并且能够启动其它的Activity。比如,一个邮件应用中可能会包含一个用于展示邮件列表的Activity,...

2015-09-03 21:08:39 1043

原创 设计模式笔记(十)--小结

设计模式根据目的的不同可以分为创建型模式、结构型模式和行为型模式。创建型模式(Creational Pattern):为了灵活而高效地创建对象。包含:工厂方法模式(Factory Method Pattern)、抽象工厂模式(Abstract Factory Pattern)、创建者模式/建造者模式(Builder Pattern)、原型模式(Prototype Pattern)、单例模式(Singleton Pattern)。结构型模式(Structural Pattern):为了完美处理对象的

2015-08-29 22:35:54 706

原创 设计模式笔记(九)--状态模式、代理模式

状态模式(State Pattern)允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。简单点说,一个对象持有一个状态对象来表示自己现在的状态,当有行为(动作请求)时,该对象会委托给当前状态对象处理,因当前状态对象的不同会表现出不同的行为。所以它利用对象组合来引用不同的状态对象,在客户看来就像修改了对象一样。代理模式(Proxy Pattern)为另一个对象提供一个替身或占位符以控制对这个对象的访问。

2015-08-27 10:32:24 647

原创 设计模式笔记(八)--迭代器模式、组合模式

迭代器模式(Iterator Pattern)提供一个方法顺序访问一个聚合对象中的元素,而不暴露其内部的表示。组合模式(Composite Pattern)允许你将对象组合成树形结构来表现“整体/部分”层次结构。组合能让客户以一致的方式处理个别对象以及对象组合。

2015-08-26 15:01:31 684

原创 设计模式笔记(七)--模板方法模式

模板方法模式(Template Method Pattern)在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。简单点说,超类的模板方法中定义了一个算法的步骤,并允许子类为一个或多个步骤提供实现。这样模板方法就控制并保护了算法,算法中的步骤可以由超类实现,也可以由各个子类根据自己的需要实现(声明为abstract)。

2015-08-25 17:23:37 519

原创 设计模式笔记(六)--适配器模式、外观模式

适配器模式(Adapter Pattern)将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。简单点说,就是利用适配器将不符合自己期望的接口转成自己想要的接口。对象适配器:

2015-08-25 16:16:21 568

原创 设计模式笔记(五)--命令模式

命令模式(Command Pattern)将请求封装成对象,以便使用不同的请求、队列或者日志 来参数化其他对象。命令模式也支持可撤销的操作。命令模式的目的就是让发出请求的对象和执行请求的对象解耦。

2015-08-21 16:48:57 467

原创 设计模式笔记(四)--工厂方法模式、抽象工厂模式

工厂模式(Factory Pattern)    (1)简单工厂(Simple Factory)也许都注意到了,这里没有使用Pattern模式的字眼,因为简单工厂更像是一种编程习惯,而不是严格意义上的设计模式。先说一下客户类怎么使用:直接Pizza pizza = PizzaFactory.createPizza("cheese");就可以获得CheesePizza类型的披萨了。

2015-08-20 17:55:12 587

原创 设计模式笔记(三)--装饰者模式

装饰者模式(Decorator Pattern)动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。简单点说,装饰者可以装饰(也就是在原来功能的基础上再扩展其功能)被装饰者。一个被装饰者可以被多个装饰者装饰,或者被相同的装饰者装饰多次,是不是很灵活啊。而这就要求装饰者和被装饰者要有相同的父类型。

2015-08-18 09:35:15 537

原创 设计模式笔记(二)--策略模式、观察者模式

(1)策略模式(Strategy Pattern)定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用它的客户。简单点说,一个客户类/对象有很多功能策略,这些策略因为对象的不同有不同的算法实现,这时我们可以将策略抽象出来,用不同的策略实现类来实现,而客户类只持有策略接口,所以很方便传给客户类不同的策略实现。也许你会说,定义一个抽象类,不同的子类来实现你说的不同算法不就行了,但仔细想想,这些不同子类的某些算法实现是一样的,如果需求说要改变,那么所有的相关子类都要改,而且某些子

2015-08-17 15:46:12 674

原创 设计模式笔记(一)--设计原则

类/对象之间的关系:Generalization(泛化),Dependency(依赖),Association(关联),Aggregation(聚合),Composition(组合/合成)泛化,表示类之间是is-a关系,如类A继承了B类或实现了B接口,子类会继承父类的属性和方法。依赖,表示类之间是use-a关系,如该类A的方法中的参数是某个类B,类A和类B就是依赖关系(类B以局部变量、静态

2015-08-13 10:49:05 474

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