该系列文章分析基于 Tinker1.7.6 版本 Tinker项目地址:https://github.com/Tencent/tinker Tinker接入及源码分析(一):简单介绍以及如何接入 Tinker接入及源码分析(二):加载补丁源码分析 Tinker接入及源码分析(三):合成补丁源码分析 上篇文章简单的介绍了Tinker的使用:《Tinker接入及源码分析(一)》 再次推荐大家阅读官方w…
该系列文章分析基于 Tinker1.7.6 版本 Tinker项目地址:https://github.com/Tencent/tinker Tinker接入及源码分析(一):简单介绍以及如何接入 Tinker接入及源码分析(二):加载补丁源码分析 Tinker接入及源码分析(三):合成补丁源码分析 现在市面上有很多Android热修复框架,包括开源的,未开源的和即将开源的。阿里巴巴的AndFix,…
线程带来的风险: 1. 安全性问题(永远不发生糟糕的事,避免竞态条件) 2. 活跃性问题(某个正确的事情最终会发生,死锁,饥饿,死锁) 3. 性能问题 线程安全性:当多个线程访问某个类时,这个类始终能表现出正确的行为,那么就称这个类时线程安全的。 竞态条件:在并发编程中,由于不恰当的执行时序而出现不正确的结果。 锁可重入意味着获取锁的操作的粒度是线程而不是调用。 在没有同步的情况下,编译器,处理器…
单元测试是什么 单元测试 是针对 程序的最小单元 来进行正确性检验的测试工作。程序单元是应用的最小可测试部件。一个单元可能是单个程序、类、对象、方法等。 ——维基百科 为什么要做单元测试 卖个关子,看完文章自然就知道了 原来和很多人一样并没有写单元测试的习惯,写好一个功能模块之后直接在真机上做自测,看看刚写的功能是否和预期一致,如果不一致,从头debug找问题出在哪儿,没问题就提交测试,测试测出问…
在项目中引入RxJava之后,得益于RxJava的各种优势,比如线程切换,避免死亡式回调,方便的数据流处理等等,便希望将所有用到回调的地方都用RxJava重写一遍。一大批使用RxJava的开源项目如雨后春笋般应运而生,RxBinding,RxBus,RxLifecycle,RxActivityResult,RxCache... 原项目中使用百度定位作为应用的定位服务,定位成功后通过回调的形式返回结…
上一篇文章写了:如何将原项目重构成MVP模式 实际使用中发现每次新建一个页面,都需要另外建三个类,分别是Contract,Model,Presenter,着实是一项枯燥无味的体力活。 当遇到这种事情的时候,最先想到的就是能不能写一段代码来做这件事。 上网一搜,果然已经有人做好了:Android Studio插件之MVPHelper,一键生成MVP代码,非常感谢这位大兄弟。 赶紧按他的步骤试了一遍,…
最近在做公司项目的重构工作,主要重构点包括: 网络请求框架由 HttpURLConnection + Handler 改为 Retrofit + OkHttp + RxJava 事件通知由 安卓广播 改为 RxBus 图片加载框架由 ImageLoader 改为 Glide 代码优化(瘦身,内存泄漏分析等) 将传统Activity作为God Object的MVC模式 改为兼容原代码的MVP模式 .…
SMB能力值控制实现文档 功能需求 服务消息总线接口管理添加能力值字段,能力控制体现为:调用次数上限/秒。 第三方应用调用消息服务总线提供的服务接口时,需要实现服务能力权限控制功能。 主要操作类 net.rubyeye.xmemcached.MemcachedClient 获取方法: MemcachedBaseService.getMemcachedService().getCache(); 方法…
前端接收乱码 1.response.addHeader("Content-Type", "text/xml" + "; charset=" + CommunicateService.charset); 2. 字节流 3. ///////////// 4. //这句话的意思,是让浏览器用utf8来解析返回的数据 5. response.setHeader("Content-type", "text/…
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.s…
Spring: Ioc(控制反转 Inversion of Control):依赖注入(DI)。 Aop(面向切面编程 Aspect Oriented Programming): 动态代理。 应用上下文: ClassPathXmlApplicationContext:从类路径下的xml配置文件中加载。 FileSystemXmlapplicationcontext:读取文件系统下的xml配置文件并…
单向加密算法:MD5,SHA。用于数据完整性验证。 对称加密算法:DES。数据储存加密的常用算法。 非对称加密算法:RSA。数据传输加密的常用算法。 柯克霍夫原则:密码系统应该就算被所有人知道系统的运作步骤,仍然是安全的。 Java API支持: MessageDigest类构建MD5,SHA两种加密算法; Mac类可以构建HMAC加密算法; Cipher类可以构建多种加密算法,如DES、AES、…
【转】伴随着 Android 5.0 发布的 Material Design,让 Android 应用告别了以前的工程师审美,迎来了全新的界面,灵动的交互,也让越来越多的 App 开始遵从 material design 设计原则,不再是以前拿着iOS设计稿,做着Android开发。本文就其中的沉浸式状态栏这一特性,描述其兼容到4.4的实现,以及一些使用中的小细节。 前言 在4.4之前状态栏一直是…
一、校验数字的表达式 1 数字:^[0-9]*$ 2 n位的数字:^\d{n}$ 3 至少n位的数字:^\d{n,}$ 4 m-n位的数字:^\d{m,n}$ 5 零和非零开头的数字:^(0|[1-9][0-9]*)$ 6 非零开头的最多带两位小数的数字:^([1-9][0-9]*)+(.[0-9]{1,2})?$ 7 带1-2位小数的正数或负数:^(-)?\d+(.\d{1,2})?$ 8 正数…
原文地址 概述 宗旨 Markdown 的目标是实现「易读易写」。 可读性,无论如何,都是最重要的。一份使用 Markdown 格式撰写的文件应该可以直接以纯文本发布,并且看起来不会像是由许多标签或是格式指令所构成。Markdown 语法受到一些既有 text-to-HTML 格式的影响,包括Setext、atx、Textile、reStructuredText、Grutatext 和 EtTex…
Java 内存模型: 线程安全: 原子性:由Java内存模型直接保证的原子性变量操作包括read,load,user,assign,stroe,write,大致可认为Java基础数据类型的读写是具备原子性的。Java内存模型还提供了lock和unlock,由高层字节码指令monitorenter和monitorexit隐匿地使用,反应到Java代码就是synchronized关键字。因此synch…
原文地址 鲍勃有两把钥匙,一把是公钥,另一把是私钥。 鲍勃把公钥送给他的朋友们----帕蒂、道格、苏珊----每人一把。 苏珊要给鲍勃写一封保密的信。她写完后用鲍勃的公钥加密,就可以达到保密的效果。 鲍勃收信后,用私钥解密,就看到了信件内容。这里要强调的是,只要鲍勃的私钥不泄露,这封信就是安全的,即使落在别人手里,也无法解密。 鲍勃给苏珊回信,决定采用"数字签名"。他写完后先用Hash函数,生成信…
ThreadLocal,线程本地变量,由于是线程内变量不存在并发问题,所以线程内可以安全的使用。 使用场景: 用来解决 数据库连接、Session管理等。 由于每次都是在方法内部创建的连接,那么线程之间自然不存在线程安全问题。但是这样会有一个致命的影响:导致服务器压力非常大,并且严重影响程序执行性能。由于在方法中需要频繁地开启和关闭数据库连接,这样不尽严重影响程序执行效率,还可能导致服务器压力巨大…
缓冲区及其操作是所有NIO的基础。 传统流IO是基于字节的,所有IO都被视为单个字节的移动;而NIO是基于块的,NIO的性能肯定优于流IO。其性能的提高主要要得益于其使用的结构更接近操作系统执行IO的方式:通道和缓冲器。我们可以把它想象成一个煤矿,通道是一个包含煤层(数据)的矿藏,而缓冲器则是派送到矿藏的卡车。卡车载满煤炭而归,我们再从卡车上获得煤炭。也就是说,我们并没有直接和通道交互;我们只是和…
申请SSL证书 国外的startssl和国内的沃通可以申请免费的SSL证书,将申请好的证书下载并解压到本地。 部署SSL证书 将申请到的证书上传到服务器中。 修改Nginx配置文件,开启ssl服务,并将SSL证书的地址配置好。 server { listen 443 ssl; server_name qlm.pw; index index.html index.htm; root /var/www…
原文地址 在关键的业务系统里,除了继续追求技术人员最爱的高吞吐与低延时之外,系统的稳定性与出现问题时排查的便捷性也很重要。 这是本文的一个原则,后面也会一次又一次的强调,所以与网上其他的文章略有不同,请调优高手和运维老大们多指引。 前言1,资料 学习开源项目的启动脚本是个不错的主意,比如Cassandra家的, 附送一篇解释它的文章。 JVM调优的"标准参数"的各种陷阱 R大的文章,在JDK6时写…
一般模式下常用按键说明 移动光标的方法 0 移动到这一行最前面字符处 $ 移动到这一行最后面字符处 H 光标移到到这个屏幕最上方第一个字符 M 光标移动到这个屏幕中间位置第一个字符 L 光标移动到这个屏幕最下方第一个字符 G 移动到这个文件最后一行 nG 移动到第n行(:set nu) gg 移动到文件第一行(1G) n[Enter] 光标向下移动n行 查找与替换 /word 向下查找 ?word…
在nio中和Buffer配合使用的还有Channel。Channel是一个双向通道,既可读,也可写。 Buffer的基本原理 位置(position)、容量(capactiy)、上限(limit) Buffer的相关操作 1.Buffer的创建 //从堆中分配 ByteBuffer buffer = ByteBuffer.allocate(1024); //直接内存访问 ByteBuffer bu…
异常机制 异常机制是指当程序出现错误后,程序如何处理。具体来说,异常机制提供了程序退出的安全通道。当出现错误后,程序执行的流程发生改变,程序的控制权转移到异常处理器。 异常处理的流程: 遇到错误,方法立即结束,并不返回一个值;同时,抛出一个异常对象 调用该方法的程序也不会继续执行下去,而是搜索一个可以处理该异常的异常处理器,并执行其中的代码 异常的分类 异常的分类: 异常的继承结构:基类为Thro…
该文章来自于阿里巴巴技术协会(ATA)精选文章。 大家都有过遇到线上程序LOAD突然狂飙的场景,要排查到为何狂飙,我们当务之急就是要找到导致CPU飙升的原因。如果是进程级的应用,如Nginx、Apache等都还比较容易排查,但如果是JVM中的某个线程导致的,估计有人就要开始抓瞎了。 很多人都或多或少的知道有这么一个脚本,能帮你大致定位到现场导致LOAD飙升的JVM线程,脚本大概如下。 #!/bin…