自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

邹迪飞

彩云为衣 清风为吟 明月为心 与天地同舞

原创 深入理解okio的优化思想

随着越来越多的应用使用OKHttp来进行网络访问,我们有必要去深入研究OKHTTP的基石,一套更加轻巧方便高效的IO库okio.OKIO的优点有同学或会问,目前Java的IO已经非常成熟了,为什么还要使用新的IO库呢?笔者认为,答案有以下几点:低的CPU和内存消耗。后面我们会分析到,okio采用了segment的机制进行内存共享和复用,尽可能少的去申请内存,同时也就降低了GC的频率。我们知道,过于

2016-04-24 18:48:46 11137 6

原创 Java语言的非对称加密的实现

众所周知,互联网上的安全是非常重要的一个课题,如何让我们的软件,通信协议更加安全,是每个程序员都需要思考的问题。 本文主要讨论三种非对称加密的情况。 1.私钥加密-公钥解密 2.公钥加密-私钥解密 3.私钥签名-公钥验证产生密钥对无论上述哪种情况,我们都需要产生一个密钥对。使用Keytool生成需要借助JDK中自带的keytool来生成。在命令行模式下输入keytool.如果配置正常,应该显

2016-04-24 00:37:01 2681 2

原创 Retrofit2.0的Converter使用

在Retrofit中, 不管是发送数据或是接收数据, 最基本都是通过OKHttp的RequestBody和ResponseBody来实现,但是通常为了方便,我们在定制协议的时候,不会直接使用原始的RequestBody或是ResponseBody,因此,在Retrofit中,我们就需要对它进行转换。在Retrofit的类的定义中,有个converterFactories的List,我们可以在buil

2016-02-29 19:33:19 4496 2

原创 React-Native Windows完全安装指南

React Native背景React Native 是facebook推出的,React Native 结合了 Web 应用和 Native 应用的优势,可以使用 JavaScript 来开发 iOS 和 Android 原生应用。在 JavaScript 中用 React 抽象操作系统原生的 UI 组件,代替 DOM 元素来渲染等。React Native的特点使用ReactNative可以动态

2016-02-27 22:52:26 3831

原创 Retrofit 2.0 常用写法示例

由于Retrofit的官方文档实在是很难理解,我这里收集了一些常见的写法,供在实际使用中参考。对URL的处理BASEURL通常我们在定义retrofit的时候,会设置一个baseurl。Retrofit.Builder builder = new Retrofit.Builder();builder.baseUrl(mBaseUrl);在2.0中,url的拼接规则与网页中的<a href="url

2016-02-25 15:10:35 2572 1

原创 Gradle中打jar包的方法

不管是在Eclipse或是在IntelijIdea中,都有比较好的方法进行打包,但是在gradle时代,打JAR包就只好自己动手写脚本了。如果,要打jar包,我们要清楚原理。 jar包其实就是把所有的class文件集合在一起,只要我们找到了编译时的输出目录即可。观察下,在build/intermediates/classes/release(debug)下有生成临时的class,这就是我们需要的路

2015-12-24 23:48:30 12216

原创 Gradle中AndroidManifest中值的替换与快速渠道打包

上一篇文章中我们介绍了Gradle中buildConfig的使用方法,同样,对manifest中的值也可以替换,<meta-data android:name="UMENG_CHANNEL" android:value="wandoujia" />比如,要根据不同的渠道替换不同的值,对于上面这种,可以写成<meta-data android:name="UMENG_CHANNEL" android:

2015-12-24 22:52:41 3126

原创 Gradle的BuildConfig使用方法

在上一篇文章中,我们介绍了使用productFlavor或是buildType进行差异化的代码编译,非常强大,但如果我们只是有一些字段常量不一样,那么,使用上述的方法就显得大材小用,这时候,我们使用另一种简单方法,即配置BuildConfig.如下方式,buildTypes { release { buildConfigField "String", "BUG

2015-12-24 22:51:12 4822

原创 Gradle中productFlavors的使用指南

我们都知道gradle非常强大,功能太多,今天就来给大家介绍下productFlavors的逆天用法。productFlavors通常是指同一软件的不同版本,比如收费版,免费版。这个版本的逻辑肯定是不一样的。如果在使用gradle之前,可能需要比较头痛的写2套代码,但现在,完全可以在一套代码中解决。比如,我们可以在gradle文件中定义两个flavor。 productFlavors {

2015-12-24 22:26:07 11603

原创 依赖注入与Dragger2使用入门

依赖注入在开始之前,我们先要搞懂什么是依赖注入。第一个版本。/** * Created by REXZOU on 2015/11/21. */public class Motor { public void addGas() { }}/** * Created by REXZOU on 2015/11/21. */public class Car { private

2015-12-24 21:49:08 1581

原创 OKHttp与丢失掉的Content-Length

由于Google觉得HttpClient太复杂,不利于维护,在AndroidM中不推荐使用HttpClient, 如果必须要使用,可以在android的模块中加上:useLibrary 'org.apache.http.legacy'当然以上语句好像还只能在android插件的1.3.0以上使用。这里要说的是遇到的一个问题,出现了一个奇怪的现象,把HttpClient替换成OKHttp之后,有时会获

2015-11-21 12:13:09 5688

原创 在Android中实现Hook机制的实验

写过windows编辑的同学肯定对当时的特别强大的HOOK记忆犹新,不管是什么系统事件,都能捕捉住,那么在android中,如何实现Hook机制呢。 hook,又叫钩子,通常是指对一些方法进行拦截。这样当这些方法被调用时,也能够执行我们自己的代码,这也是面向切面编程的思想(AOP)android中,本身并不提供这样的拦截机制,但是有时候,我们可以在一些特殊的场合实现一种的Hook方法。 大致

2015-11-18 14:30:19 7067 1

原创 Material Design实现之 CoordinatorLayout的滚动效果

CoordinatorLayout是google在android L之后引入的新控件,用于实现Material Design的多种滚动效果。而关键在于我们使用CoordinatorLayout不用写多少代码就能实现一些非常酷的动画,能够极大的提升我们的效率。那么,听起来很神奇的CoordinatorLayout要怎么使用呢?通常情况下,我们一个界面的元素包括顶部区域,比如Toolbar,或是其他有

2015-11-15 23:11:53 3432 1

原创 如何优雅的在AndroidM中使用SD卡

如果你读过我之前的文章《Android M 部分API变动研究》,那么就应该知道,在AndroidM中,WRITE_EXTERNAL_STORAGE/READ_EXTERNAL_STORAGE已经被列为危险级的权限,那么是不是每次读写SD卡都必须去申请这个权限呢? 要回答这个问题,我们先看android中为我们提供了哪些访问SD卡的API通常,我们访问SD主要有两种入口,Environment.

2015-11-10 23:25:52 1046

原创 Material Design 实现之 RecyclerView高级特性

RecyclerView的对象池RecyclerViewPool前面提到了,RecyclerView的优势是多个RecyclerView可以共用一个对象池,显而易见,这样能减少View的创建,提高性能,这种场景特别适合于像应用市场或资讯类使用ViewPage+ListView(RecyclerView)的场合。这里说的对象池就是RecyclerViewPool。在使用上也非常简单,维护一个实例,然后

2015-11-10 19:21:46 3445

原创 Android M 部分API变动研究

Android M发布有一段时间了,AndroidM在API上的改动,并不比AndroidL小。我们只能感谢Google又给android程序员带来的新的研究课题,以前开发的程序如何才能在AndroidM上顺利运行,因此,让无所事事的程序又要折腾一阵子了。权限请求方式变更动态权限请求是Google在对Android的安全问题进行一次非常有效的提升,对用户是非常有用的,用户可以很任性的关掉App一些权

2015-11-08 15:45:06 1109

原创 Material Design 实现之 RecyclerView基本特性

在上一篇文章中介绍了RecyclerView的基本使用,这节课我们继续介绍RecyclerView的一些高级特性。轻量化的通知前面提到RecyclerView的Adapter对数据变动的通知作了优化,更加的精准与轻量。现在我们就来介绍怎么使用。Adapter的通知分为单体通知和群体通知。在底层的实现中,实际上是最终调用的群体通知。public final void notifyItemInserte

2015-11-08 12:14:27 906

原创 Material Design 实现之 RecyclerView使用

RecyclerView是google在去年的IO大会新推出的用以取代ListView的新控件,它的扩展性与灵活性都显著优于ListView。RecyclerView的优点其优点,我总结如下,省内存。多个RecyclerView可共用View。这样,如果一个应用中有多个类似的界面,比如应用市场各榜单的界面是差不多的,这样可以省非常多的内存。布局灵活。RecycleView的布局方式与其本身彻底分

2015-11-06 00:43:59 742

原创 理清互联网金融的脉络(二)

传统金融的互联网化传统金融机构的互联网化,实际上是把销售渠道从线下搬到了线上。比如国内大多数的商业银行推出了网上银行,手机银行,比如平安保险建立了在线的销售官网。搬到线上的优势除了降低成本,更重要的是可以进行大数据分析,从而精准投递。另一方面,由于成本降低,银行可以做到原来做不到的事情,比如个性化,也叫私人定制,对客户从更多的维度,如消费习惯,年龄,存款等进行分类,而从定制出更加贴心的产品。

2015-10-30 00:09:58 519

原创 理清互联网金融的脉络(一)

“在这种金融模式下,支付便捷,市场信息不对称程序非常低;资金供需双方直接交易,银行,券商和交易所等金融中介都不起作用;可以达到与现在直接和间接融资一样的资源配置效率,并在促进经济增长的同是,大幅减少交易成本。”–谢平什么是互联网金融从广义上来说,传统的互联网企业,提供金融服务,或是传统的金融企业,接入线上功能,都可以归为互联网金融。就纵向来看,传统的金融服务如果是第一代(1st Generation

2015-10-29 20:14:15 578

原创 Material Design 实现之属性动画

属性动画并不是一个新事物,早在Android3.0的时候,Google就推出了aiminator相关的动画类,这个知识点是非常成熟了,但为什么这里我要拿出来冷饭热炒,的确是因为理解它太重要了,它可以是说后面介绍的包括activity动画,场景动画的基础。如果说场景动画是一幢外表华丽的大楼,则属性动画就是修建这个大楼的基石。动画的基本属性要实现一个动画,我们需要考虑以下几个维度。时间。

2015-10-29 01:06:13 707

翻译 Android 6.0 新增API 简介(5)

摄像头新的API能够访问闪光和再处理图像。闪光灯API如果一台摄像机带有闪光灯,则你可以在不打开摄像头的情况下,调用setTorchmode方法来开关灯。应用不需要独占闪光灯或是摄像头。当摄像不可用时或是有其他摄像头资源有占用时,电筒模式会被关掉。其他应用可以使用setTorchMode方法来关掉电筒模式。可以使用registerTorchCallback()注册一个回调,当电筒模式有改变时能够通知

2015-10-20 19:43:24 1909

翻译 Android 6.0 新增API 简介(4)

音频此版本中增加了对MIDI协议的支持,可以在包android.media.midi中提供的API发送和接收MIDI事件新增了AudioRecord.Builder和AudioTrack.Builder类来进行音频录制和播放,同时也能修改声源与一些系统属性。能够监听声音设备和其他输入设备。当你的应用允许用户开始语音搜索游戏手柄或是远程连接的AndroidTV特别有用。系统会通过回调onSear

2015-10-19 19:28:36 638

翻译 Android 6.0 新增API 简介(3)

蓝牙触控笔支持这次发布能支持蓝牙触控笔,用户可以把手机(平板)与兼容的蓝牙触控笔进行配对,当连接上后,位置和压力等信息可从触控笔上传递给手机。你的应用程序可以在Activity中注册View.OnContextClickListenerGesture和Detector.OnContextClickListener这两个方法来监听触控笔事件。可以使用MotionEvent方法和其常量来检测触控笔按键交

2015-10-12 19:50:30 1099

翻译 Android 6.0 新增API 简介(2)

分享功能这个版本的API可以做到直接分享数据给用户。你现在可以定义直接分享目标在你应用的Activity中。这个直接分享目标可以通过Share菜单来给用户使用。用户可以分享内容如联系人给其他应用。比如说,直接分享目标能启动另一个应用中的Activity,把内容分享到另一个社交网络的好友或社区。要实现这个功能,需要继承ChooserTargetService,同时在manifest中声明。同时,需要指

2015-10-10 19:01:00 1324

原创 Material Design 实现之Toolbar的应用及其菜单动画

在Android5.0中,Google推出了更加灵活的Toolbar来取代ActionBar。Toolbar的优点是更加灵活,比如以前一个界面只能设置一个ActionBAR,但可以有多个Toolbar。而Toolbar同样可以设置菜单,颜色图标等,可以自定义的元素比ActionBAR多。因此,在Android应用程序中使用toolbar是一种趋势。为了提高程序的兼容性,我们通常都使用V7包中的Too

2015-10-10 00:24:02 2251

翻译 Android 6.0 新增API 简介(1)

Android 6.0 新增API 简介(1)android 6.0 (M)提供了一些新的特性,这篇文章将介绍最有价值的API。指纹验证新版的API能够在带有指纹识别的硬件的手机上通过指纹来验证用户。首先,我们需要获取FingerprintManager的一个实例然后调用authenticate方法FingerprintManager fm = context.getSystemService( C

2015-10-09 19:31:07 4426

原创 Material Design 实现之主题使用Theme

Material Design 实现之主题使用ThemeMaterial Design 是Google在Android L推出来的一套新的设计规范, 有着鲜明的色彩,极致的用户体验,酷炫的动画。本系例将带给大家一套完整的Material实现方案。 预计本系例将覆盖以下几个主题:1.MaterialDesign主题的使用2.Toolbar的应用,及其菜单动画3.属性动画的基本介绍(基础)4.Tra

2015-09-16 16:54:06 4302

原创 android生成Jar包的注意事项

不要把BuildConfig.java放入jar中,会有潜在的风险。

2015-05-30 17:51:09 637 3

原创 应用市场的来源

有时统计时,需要知道这个APK从什么地方安装的。一般来说,我们会有渠道来做这件事。但其实,只要应用市场支持,我们即可读取安装来源。Packagemanager.getInstallPackageName, 从中可以获取你的安装来源,目前已知支持这个有百度,GooglePlay,亚马逊,其他市场没有测过。在PACKAGEMANAGER中有一个getInstallPackageName, 从中可以

2015-05-30 17:47:26 978

原创 Launcher开发之自定义内容

原来以为这Launcher的左边实现一个自定义的内容会很复杂。看完launcher的代码后才发现,原来launcher已经帮我们做好了。只需要两步第一步重写下面的方法,设置为true /** To be overriden by subclasses to hint to Launcher that we have custom content */    protected bo

2015-05-30 17:41:30 1374

原创 volley 框架剖析(四) 之HTTPCache设计

记得有位高人说过,成功在于细节。同样,一份代码质量如何,同样也在于对细节的处理上。考虑的情况越多,则出现问题的概率也就越低。 Cache之前也写过,但看了Volley的Cache之后,真心觉得差距大了。不废话了,还是上大餐吧public static class Entry { /** The data returned from cache. */ public

2015-05-10 18:14:56 1048

原创 volley 框架剖析(三) Request类精解

Request是所有网络请求的基类,它实现了Comparable接口,前面提到RequestQueue可按照优先级队进行排序,这里的Comparable就是为优先级排序作准备。接下来,我们对Request中比较重要或有趣的成员或方法进行一一解释。Request中包括一个对支持的Http方法的定义。这里使用的内部接口而不是枚举来实现的。 public interface Method {

2015-04-26 22:05:13 1122

原创 Volley框架剖析( 二)从开始到结束

上一篇中,我们分析了Volley的一个总体组成。今天我们继续分析Volley的一个数据流走向,即从初始化到发起请求,再到请求结束的一个流程。先看初始化。 Volley的初始化,实际上就是返回一个RequestQueue的队列。在Volley中调用。一个最简单的创建方式即有一个Context即可。/** * Creates a default instance of the worker

2015-04-25 17:29:20 960

原创 volley 框架剖析(一) 面向接口的编程

Volley是Google出品的一个轻量级的网络框架,默认实现,主要用于小数据量的网络请求。这里就按从粗到细,自上而下的过程,给大家剖析这个牛X的框架。这个框架的代码量虽少,但却把面向接口的编程这个原则发挥的淋漓尽致。这个框架是怎么构成的呢?先看包的结构。有com.android.volley 及 com.android.volley.toolbox两个包。其中com.androi

2015-04-22 00:58:41 1368

原创 Gradle 导入开源工程 常见问题解决方法(持续更新中)

1. build时出现以下错误Cause: peer not authenticated通常情况下这是HTTPS下载时认证不通过造成的。这时可看出现问题的链接是什么,如果是下载gradle插件自身,则可以找到gradle/wrapper/gradle-wrapper.properties 这个文件。把文件中的istributionUrl从Https改为http如果是

2015-04-21 16:34:35 15775

原创 单例的扩展性讨论

在上一篇中,讨论了单例的4种基本形态,这次我们来探讨单例的变形。1.有限个数的单例形式。即这个对象可能有多个,从这个角度上说,它其实不属于单例,但实现方式确是以单例为基础的。它通常是以带参数的getInstance(或其变型)存在。public class MultiInstanceDemo { private String mType; private MultiI

2015-04-12 13:21:36 769 1

原创 Gradle的文件编码设置

有时,用命令行编译时,对于UTF8文件中的中文,会出现乱码的情况,如                                  ^F:\workspace\TestHello\src\main\java\com\win16\testhello\ShortLifeObject.java:8: error: unmappable character for encoding GBK

2015-04-12 11:02:20 7226

原创 单例--网络世界的计划生育

单例,一个进程空间中,一个类只能生成一个对象。这里加了进程的概念,超出进程来讲单例,有没有意义?通常情况下是没有的。但我在扩展篇里会聊到一些特殊的单例。最简单的实现,基本一行代码可以搞定。V1.0public static final SingleInstance instance = new SingleInstance();private Sin

2015-03-27 23:13:32 877

原创 Effective Java 学习笔记(8)

当重载equals方法时,遵循惯例.equals不是每个类都必须重载,当以下几个条件满足,可以不重载equals.1. 类的实例只有同一个才被判为相等. 如Thread类.2. 不用关心两个对象是否逻辑相等的时候,或是说比较对象没有意义.3.父类已经重载了equals,而且父类的equals也适用于子类,子类就不用重载equals.4.这是一个私有类或是包内访问,你确定equa

2010-01-24 19:34:00 328

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