自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(95)
  • 资源 (7)
  • 收藏
  • 关注

原创 JavaScript之Promise实现

ES2015提出了Promise,同时基于Promise的异步开发将开发者中回调地狱中解救出来。但在没有原生支持的环境下,需要借助Promise/A+之类的库来实现Promise,今天就来尝试自行实现Promise

2017-12-18 20:32:56 416

原创 JavaScript异步之Promise

Promise使用介绍

2017-12-18 20:32:09 589

原创 CSS3D之 perspective、perspective-origin属性

介绍perspective以及perspective-origin属性含义及常见用法

2017-12-18 20:31:22 1483

原创 CSS3 Animation实现加载动画

利用CSS3中的animation,可以实现很多很炫的效果。今天就来利用animation属性完成如上图所示的加载效果

2017-12-18 20:29:59 834

原创 CSS3 3D相册

今天来做一个基于CSS3 3D属性的3D相册效果

2017-12-18 20:29:24 1798 3

原创 JavaScript 函数原型链解析

在JavaScript中,函数原型链是最强大也是最容易让人迷惑的特性。长期以来对于prototype和__proto__的一知半解导致在实际开发中经常遇到难以排查的问题,所以有必要将JavaScript中的原型概念理解清楚。

2017-12-09 19:33:13 718

原创 JavaScript设计模式介绍

由于JavaScript不是典型的面向对象语言,因而在实现一些经典的设计模式上也与一般语言存在差异,本文主要介绍在JavaScript中如何实现常用的设计模式。

2017-12-09 19:31:57 230

原创 CSS 消息气泡实现

消息气泡样式实战

2017-12-04 21:02:34 8183

原创 CSS居中方案介绍

介绍常见的水平、垂直居中方案

2017-11-30 13:37:25 266

原创 CSS经典三栏布局方案

介绍CSS经典三栏布局的6种方案

2017-11-30 11:33:31 348

原创 addrinfo& sockaddr结构解析

介绍addrinfo和sockaddr结构

2017-11-28 21:15:08 1274

原创 ProGuard 混淆解析

最近被keep keepnames keepclassmembers等几个混淆规则搞得晕头转向,看起来虽然简单,但用起来却经常跟自己预想的一样。所以决定放弃看他人总结的博客,直接看ProGuard官方文档,目前为止,总算是有一定了解了。1 ProGuard简介通常我们都认为ProGuard是一个代码混淆工具,实际上其作用还不至于此,而是包括了四部分内容:shrink(删减):删减无用代码,包括无用

2017-08-15 22:04:08 1215

原创 InstantRun原理(2)——更新逻辑

上一篇博客我们介绍了InstantRun的初始化逻辑,接下来我们来看下在运行时阶段,InstantRun是如何加载修改的代码的。上一篇博客的末尾我们介绍了InstantRun在初始化完成后,会启动一个server。不难猜测,这个server就是在监听是否有代码更新。当用户更改代码后,AndroidStudio会将相关更新发送给server,server获取到更新后执行修复逻辑。

2017-08-15 21:59:47 550

原创 InstantRun原理(1)——初始化逻辑

Android Studio 2.0开始支持 Instant Run 特性, 使得在开发过程中能快速将代码变化更新到设备上。

2017-08-15 21:57:54 754

原创 Java并发——volatile的原理

volatile关键字就是Java中提供的另一种解决可见性和有序性问题的方案。对于原子性,需要强调一点,也是大家容易误解的一点:对volatile变量的单次读/写操作可以保证原子性的,如long和double类型变量,但是并不能保证i++这种操作的原子性,因为本质上i++是读、写两次操作。

2017-07-25 20:44:04 397

原创 Java并发——线程间协作(wait、notify、sleep、yield、join)

1线程的状态Java中线程中状态可分为五种:New(新建状态),Runnable(就绪状态),Running(运行状态),Blocked(阻塞状态),Dead(死亡状态)

2017-07-25 20:43:17 533

原创 Java并发——Synchronized优化(轻量级锁、偏向锁)

Synchronized的实现依赖于与某个对象向关联的monitor(监视器)实现,而monitor是基于底层操作系统的Mutex Lock实现的,而基于Mutex Lock实现的同步必须经历从用户态到核心态的转换,这个开销特别大,成本非常高。所以频繁的通过Synchronized实现同步会严重影响到程序效率

2017-07-25 20:42:11 1772

原创 Java并发——Synchronized及其实现原理

接下来我们就来看下Synchronized的实现原理,看看Synchronized是如何实现上述三个作用的。Synchronized有三种常用方法:修饰普通方法、修饰静态方法、修饰代码块

2017-07-25 20:39:44 504

原创 Java并发——核心理论

并发编程是Java程序员最核心的技能之一,同时也是掌握难度最大的一部分。我们都知道Java中提供了各种异步机制,但无论是notify wait、synchronized、volatile亦或是java.util.conccurrent包下的ReentrantLock、ThreadPoolExecutor都遵循着相同的异步理论,要理解上述并发机制就必须首先了解Java异步的核心原理。

2017-07-25 20:37:30 438

原创 java.util.concurrent解析——AbstractQueuedSynchronizer队列管理

上一篇博客中,我们提到AQS的队列管理是基于CLH锁队列实现的,所以首先我们来看下CLH锁队列。1 CLH锁队列CLH锁队列本质上是一个基于链表的FIFO自旋锁队列,队列中的每一个节点实质上是一个自旋锁:在阻塞时不断循环读取状态变量,当前驱节点释放同步对象使用权后,跳出循环,执行同步代码。

2017-07-25 20:35:49 503

原创 java.util.concurrent解析——AbstractQueuedSynchronizer综述

尽管JVM在并发上已经做了很多优化工作,如偏向锁、轻量级锁、自旋锁等等。但是基于Synchronized wait notify实现的同步机制还是无法满足日常开发中。原生同步机制在时间和空间上的开销也一直备受诟病。为了提升Java程序在并发场景下的性能、扩展性和健壮性,java.util.concurrent的使用必不可少。

2017-07-25 20:32:56 970

原创 java.util.concurrent解析——ThreadPoolExecutor源码解析

任何一种语言、框架,线程都是非常重要的一部分。要想实现异步就需要通过异步线程,但是频繁地创建销毁线程会带来较大的性能开销,而线程池就是为解决这一问题而出现的

2017-07-16 22:35:38 718

原创 java.util.concurrent解析——FutureTask源码解析

Runnable、Callable、Future、FutureTask的区别与联系和Java异步打交道就不能回避掉Runnable,Callable,Future,FutureTask等类,首先来介绍下这几个类的区别

2017-07-16 22:33:51 1151

原创 JVM学习笔记(四)——字节码执行引擎

代码编译的结果从机器码转变为字节码,是存储格式的一小步,确实编程语言发展的一大步。正是因为有了字节码这一中间格式才有了Java语言跨平台的特性。字节码并不能直接基于物理机执行引擎执行,因为物理机执行引擎是建立在特定的处理器,指令集以及操作系统之上的,并不具备跨平台特性。所以执行字节码的责任就交给了虚拟机中的字节码执行引擎。1 运行时栈帧结构栈帧是用于刻画Java程序运行时一个方法的调用、执行以及返回

2017-07-10 21:15:09 365

原创 JVM学习笔记(三)——虚拟机类加载机制

在介绍完class文件格式后,我们来看下虚拟机是如何把一个由class文件描述的类加载到内存中的。具体来说java中类的加载涉及7个阶段:加载、校验、准备、解析、初始化、使用、卸载。1.加载时机并不是所有的类在程序启动时即被加载,为提升效率,虚拟机通常秉承的是按需加载的原则,即需要使用到相应的类时才加载对应的类。具体包括如下几个加载时机:遇到new、getstatic、putstatic、invo

2017-07-10 21:13:13 367

原创 JVM学习笔记(二)——Class文件结构

JVM学习笔记(二)——Class文件结构Class文件是Java程序跨平台的保证,正是由于有了Class文件架起源码和机器码之间的中间桥梁,JVM虚拟机才可以在各种平台上按照统一的规范标准加载Java代码。作为“写给虚拟机看的”Java代码,Class文件结构必须设计得足够完善,同时由于Java虚拟机规范并不只针对Java,Class文件又不能引入过多细节。本篇博客我们就来介绍下Class文件的结

2017-07-10 21:12:05 443

原创 JVM学习笔记(一)——内存模型

对于Java程序员来说,他们相比C++程序员最幸福的一点就是不用自己管理内存,内存的分配和回收都由虚拟机完成。然而,正是由于该原因,一旦虚拟机内存管理出现问题,比如出现内存泄漏或溢出,排查起来将是非常困难的。所以尽管不用亲自动手管理内存,但是了解虚拟机的内存管理机制还是很有必要的。运行时数据区域首先来看下Java虚拟机在运行时的数据区域划分,Java虚拟机在Java程序运行时会将内存区域划分成若

2017-07-10 21:10:53 361

原创 OkHttp 3.7源码分析(五)——连接池

接下来讲下OkHttp的连接池管理,这也是OkHttp的核心部分。通过维护连接池,最大限度重用现有连接,减少网络连接的创建开销,以此提升网络请求效率。1. 背景1.1 keep-alive机制在HTTP1.0中HTTP的请求流程如下:这种方法的好处是简单,各个请求互不干扰。但在复杂的网络请求场景下这种方式几乎不可用。例如:浏览器加载一个HTML网页,HTML中可能需要加载数十个资源,典型场景下这些资

2017-05-21 14:43:09 945

原创 OkHttp 3.7源码分析(四)——缓存策略

合理地利用本地缓存可以有效地减少网络开销,减少响应延迟。HTTP报头也定义了很多与缓存有关的域来控制缓存。今天就来讲讲OkHttp中关于缓存部分的实现细节

2017-05-21 14:42:07 592

原创 OkHttp 3.7源码分析(三)——任务队列

前面的博客已经提到过,OkHttp的一个高效之处在于在内部维护了一个线程池,方便高效地执行异步请求。本篇博客将详细介绍OkHttp的任务队列机制。1. 线程池的优点OkHttp的任务队列在内部维护了一个线程池用于执行具体的网络请求。而线程池最大的好处在于通过线程复用减少非核心任务的损耗。

2017-05-21 14:40:04 531

原创 OkHttp 3.7源码分析(二)——拦截器&一个实际网络请求的实现

前一篇博客中我们介绍了OkHttp的总体架构,接下来我们以一个具体的网络请求来讲述OkHttp进行网络访问的具体过程。由于该部分与OkHttp的拦截器概念紧密联系在一起,所以将这两部分放在一起进行讲解

2017-05-21 14:38:26 908

原创 OkHttp 3.7源码分析(一)——整体架构

OkHttp是一个处理网络请求的开源项目,是Android端最火热的轻量级框架,由移动支付Square公司贡献用于替代HttpUrlConnection和Apache HttpClient。随着OkHttp的不断成熟,越来越多的Android开发者使用OkHttp作为网络框架。之所以可以赢得如此多开发者的喜爱

2017-05-21 14:36:10 1202 1

原创 HttpClient/HttpURLConnection + HttpDns最佳实践

如果使用`HttpClient`或`HttpURLConnection`发起网络请求,尽管无法直接自定义Dns服务,但是由于`HttpClient`和`HttpURLConnection`也通过`InetAddress`进行域名解析,通过修改`InetAddress`的DNS缓存,同样可以比通用方案更为优雅地使用HttpDns。

2017-04-23 12:58:55 3397

原创 Android热修复技术——QQ空间补丁方案解析(3)

如前文所述,要想实现热更新的目的,就必须在dex分包完成之后操作字节码文件。比较常用的字节码操作工具有ASM和javaassist。相比之下ASM提供一系列字节码指令,效率更高但是要求使用者对字节码操作有一定了解。而javaassist虽然效率差一些但是使用门槛较低,本文选择使用javaassist。

2017-04-23 12:57:11 806

原创 Android热修复技术——QQ空间补丁方案解析(2)

接下来的几篇博客我会用一个真实的demo来介绍如何实现热修复。具体的内容包括:如何打包补丁包如何将通过ClassLoader加载补丁包

2017-04-23 12:55:44 1497

原创 Android热修复技术——QQ空间补丁方案解析(1)

传统的app开发模式下,线上出现bug,必须通过发布新版本,用户手动更新后才能修复线上bug。随着app的业务越来越复杂,代码量爆发式增长,出现bug的机率也随之上升。如果单纯靠发版修复线上bug,其较长的新版覆盖期无疑会对业务造成巨大的伤害,更不要说大型app开发通常涉及多个团队协作,发版排期必须多方协调。 那么是否存在一种方案可以在不发版的前提下修复线上bug?有!而且不只一种

2017-04-23 12:54:19 670

原创 JNI编程基础(二)——Android Studio NDK开发

由于笔者目前的工作是Android开发,所以在JNI开发系列博客中穿插一篇AndroidStudio NDK开发介绍。随着Android Studio 2.2的推出,Android Studio的NDK开发支持Cmake和ndk-build两种方式,简化了Android Studio上NDK开发流程,提升了开发效率。接下来就介绍下两种开发方式

2017-04-23 12:53:09 880

原创 JNI编程基础(一)

JNI-Java Native Interface,是Java平台提供的一个特性,通过编写JNI函数实现Java代码调用C/C++代码以及C/C++代码调用Java代码的作用。

2017-04-23 12:51:55 544

原创 APP消息推送方案调研

目前行业内有多家消息推送服务供应商,且各家都宣称自家产品的核心指标行业领先。为了不被各家推送厂商忽悠,量化消息推送到达率效果,我们需要整理设计一套消息推送服务对比量化方案,一切以线上实测数据为准,通过线上到达率数据进行效果评判。

2017-03-09 09:55:52 7412 1

原创 Android启动过程详解(4)——SystemServer

上一篇博客介绍了ZygoteService的启动过程,在Zygote的启动后首先就会启动SystemServer。Android应用框架中的各种Service,例如ActivityManagerService,PacakgeManagerService,WindowManagerService都在归SystemServer管理,今天就来讲讲SystemServer的启动

2016-11-20 02:44:07 1037

自己动手写malloc函数

my_malloc:自己动手写的malloc函数.希望对大家了解内存管理有所帮助

2015-03-27

C++ 编程艺术

C++编程经典之作,详细介绍了C++这门精密的语言的博大之处

2014-09-11

android manifet文件简介

关于android上manifest文件的简介,希望可以帮到各位android开发者

2012-04-19

关于android Matrix的使用

关于android上matrix的使用,可以开发者更好地掌握android上的图片处理技巧

2012-04-19

android颜色大全

提供android上各种颜色的RGB值,开发者可以轻松地选取自己中意的颜色

2012-04-19

ANDROID基本控件介绍

关于android基本控件的基本介绍 是开发者对android提供的各种控件有一个更为基本的认识,以便更好地开发。

2012-04-19

空空如也

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

TA关注的人

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