自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

robert的专栏

Android开发,java编程

原创 Volley源码解析使用方式和使用场景分析

Volley是Google在2013年推出的一个网络库,用于解决复杂网络环境下网络请求问题。刚推出的时候是非常火的,现在该项目的变动已经很少了。项目库地址为 https://android.googlesource.com/platform/frameworks/volley 通过提交历史可以看到...

2016-06-14 22:25:33 4621 3

原创 Android 事件总线OTTO使用说明和源码解析

OTTO是Square推出的库,地址:https://github.com/square/otto OTTO基于Guava项目的Android支持库,如果你在Android程序开发的过程中想要不同的组件之间进行有效的通信可以使用这个库。通过otto库可以。 otto的官方介绍 An enhance...

2016-06-10 21:59:21 7021 0

原创 Retrofit2使用方式和源码解析

Retrofit2对Retrofit做了很大改进,做一下详细比对 参考https://inthecheesefactory.com/blog/retrofit-2.0/en 底层okhttp不同 Retrofit 默认使用okhttp Retrofit2 默认使用okhttp3 Service...

2016-06-04 23:33:01 12838 0

原创 Picasso的使用和源码解析

一、基本介绍 picasso是Square公司开源的一个Android图片下载缓存库,github地址https://github.com/square/picasso,可以实现图片下载和缓存功能。 Picassso的特点有: 自动将图像缓存在本地,自带内存和硬盘二级缓存功能 通过...

2016-06-03 23:49:42 8595 0

原创 EventBus的使用和源码解析

基本介绍 EventBus 是一个 Android 事件发布/订阅框架,通过解耦发布者和订阅者简化 Android 事件传递,这里的事件可以理解为消息,本文中统一称为事件。事件传递既可用于 Android 四大组件间通讯,也可以用户异步线程和主线程间通讯等等。EventBus EventBus3....

2016-06-01 00:59:13 10016 0

原创 Android事件的产生和底层分发

目录 事件的产生 系统分发 EventHub InputReader InputDispatcher 接收事件 事件的产生 当屏幕被触摸,Linux内核会将硬件产生的触摸事件包装为Event存到/dev/input/event[x]目录下。 可以通过命令监控event adb ...

2019-08-21 16:09:32 64 0

原创 从代理模式到mockito原理

代理模式回顾 代理模式的定义:代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。 抽象角色Subject:通过接口或抽象类声明真实角色实现的业务方法。 代理角色Proxy:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加...

2019-05-09 14:31:05 500 0

原创 lambda表达式介绍以及Android Studio引入lambda

一、简介“Lambda 表达式”(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。Lambda表达式可以表示闭包。运算符将表达式分为两部分,左...

2017-01-11 10:52:15 4574 0

原创 Https简单介绍

一、HTTPS是什么  HTTPS(全称:Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。 它...

2017-01-07 10:25:20 3183 0

原创 移动设备无线投屏到电视机

移动设备无线投屏到电视机主要有三种种技术:AirPlay、DLNA与Miracast技术。 DNLA,Digital Living Network Alliance,是索尼、英特尔、微软等发起的一套 PC、移动设备、消费电器之间互联互通的协议。它们的宗旨是“随时随地享受音乐、照片和视频”。 DLN...

2016-10-23 21:31:37 17359 2

原创 微信小程序

微信小程序官方文档 https://mp.weixin.qq.com/debug/wxadoc/dev/ 目前是内测阶段,大多数人没有收到内测邀请,无法获取小程序APPID,但是这并不影响我们开发,只是不能在手机上看效果, 只能在开发环境提供的调试器中看效果,访问一些敏感信息API受限。 官方文档...

2016-09-30 12:34:54 2859 0

原创 Android日志的使用技巧

Android系统提供了logcat工具来记录打印log,先来聊一下logcat的使用adb logcat --helpUsage: logcat [options] [filterspecs]options include:  -s              Set default filter...

2016-09-27 20:21:36 3163 0

原创 Android 的String资源格式化方法

很多时候我们感性Google在设计Android时遵守了大量MVC架构方式,可以让写公共代码、美工和具体逻辑开发人员独立出来。有关Android 的资源文件values/strings.xml中如何实现格式化字符串呢? stringdemo hello robert 上面是一段简单...

2016-08-25 09:27:49 3371 0

原创 Realm使用简单介绍

Realm是一个轻量级的数据库,在Android开发中,它可以替代 SQLite 和 ORM 框架。相比SQLite,Realm更快并且具有很多现代数据库的特性,比如支持JSON,流式api,数据变更通知,以及加密支持。 工程配置 1、在工程根目录的build.gradle中添加dependenc...

2016-08-02 20:42:57 7065 0

原创 SQLite清空表并将自增列归零

SQL标准中有TRUNCATE TABLE语句,用来清空表的所有内容。但SQLite不支持这个语句。在SQLite中直接使用“DELETE FROM TableName”就可以了。对于大多数DBMS来说,用DELETE不如用TRUNCATE 速度快,因为TRUNCATE 不用访问整个表,不用记录数...

2016-07-20 22:12:15 15812 2

原创 JAVA并发编程(四)任务的取消与关闭

使用简单标志位保存取消状态 为了保证标志位可靠,标志必须为volatile类型。 使用标志位来取消任务是不及时的,如果中间调用了阻塞方法,有可能永远都无法结束。 每个线程都有一个boolean类型的中断状态,interrupt方法能中断目标线程,而isInterrupted方法能返回目标线程的中断...

2016-07-16 00:00:10 6076 0

原创 算法系列(十三)图论基本概念和拓扑排序

图的定义 一个图G=(V,E),由定点的集合V,和边的集合E组成。每一条边都是一副点对(v,w),边也称作弧,边上可以有权值。如果点对是有序的,那么图就是有向的。 图中的一条路径是一个顶点序列w1,w2,w3......wN,如果图中包含一条从顶点到自身的边,那么这个路径就是环。 有向无环图也成为...

2016-07-11 14:49:20 4472 0

原创 JAVA并发编程(三)设计线程安全的类

设计线程安全类的过程中需要注意三个基本要素: 1、找出构成对象的所有变量 2、找出约束状态变量的不变性条件 3、建立对象状态的并发访问管理策略 Java5.0提供了多种并发容器来改进同步容器的性能。同步容器将所有对容器状态访问都串行化,以实现它们的线程安全,这种方法的代价是严重降低了并发性。当多个...

2016-07-10 19:16:20 8066 0

原创 Android中View绘制流程分析

在Activity的attach方法中通过调用PolicyManager.makeNewWindo创建Window,将一个View add到WindowManager时,WindowManagerImpl创建一个ViewRoot来管理该窗口的根View。并通过ViewRoot.setView方法把...

2016-07-09 19:20:16 3449 1

原创 算法系列(十二)散列

Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定...

2016-07-08 21:36:24 5985 0

原创 JAVA并发编程(二)内置锁和对象共享

Java提供了一种内置的锁机制来支持原子性:同步代码块(Synchronized Block)。内置锁的最小颗粒度是对象,修饰方法上的锁也是作用于对象。有时候叫它方法锁,但是实际上是锁住的对象。 内置锁又被称为监视锁,线程在进入同步代码块之前会自动获得锁,推出时才释放锁,获得内置锁的唯一路径就是进...

2016-07-06 22:18:26 3383 0

原创 Android不依赖Activity的全局悬浮窗实现

Android悬浮窗实现  实现基础 Android悬浮窗实现使用WindowManager ,WindowManager介绍   通过Context.getSystemService(Context.WINDOW_SERVICE)可以获得 WindowManager对象。 每一个WindowMa...

2016-07-02 21:58:01 23421 2

原创 算法系列(十一)BASE64算法实现和使用说明

完整的BASE64定义可见RFC 1421和RFC 2045。编码后的数据比原始数据略长,为原来的 43。在电子邮件中,根据RFC 822规定,每76个字符,还需要加上一个回车换行。可以估算编码后数据长度大约为原长的135.1%。 转换的时候,将三个byte的数据,先后放入一个24bit的缓冲...

2016-07-01 10:28:52 6195 0

原创 Activity的生命周期和启动模式详解

BACK键:   当我们按BACK键时,我们这个应用程序将结束,这时候我们将先后调用onPause()->onStop()->onDestory()三个方法。 再次启动App时,会执行onCreate()->onStart()->onResume() HOME键:   当我...

2016-07-01 10:12:42 6601 0

原创 Android进程分类与管理

Android采 取了一种有别于Linux的进程管理策略,有别于Linux的在进程活动停止后就结束该进程,Android把这些进程都保留在内存中,直到系统需要更多 内存为止。这些保留在内存中的进程通常情况下不会影响整体系统的运行速度,并且当用户再次激活这些进程时,提升了进程的启动速度。 那Andr...

2016-06-30 13:53:05 5437 0

原创 Android热补丁技术方案整理

项目快速迭代过程中,不可避免的出现BUG,Android线上出现问题,通常需要发版解决。紧急发版,用户不一定升级,强制升级又不友好,有什么更好的解决方案呢?这就用到了热修复技术。 QQ团队的hotfix,后来发展成为RocooFix, GitHub地址: https://github.com/do...

2016-06-29 12:06:54 8615 0

原创 AsyncQueryHandler异步操作数据库的使用和源码解析

一.AsyncQueryHandler的作用: 异步的查询操作帮助类,它可以处理增删改查。当然也可以使用ContentProvider去操作数据库。这在数据量很小的时候是没有问题的,但是如果数据量大了,可能导致UI线程发生ANR事件。当然也可以写个Handler去做这些操作,只是每次使用Conte...

2016-06-28 17:35:15 4704 0

原创 Android中asset文件夹和raw文件夹

res/raw和assets的相同点:两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制。 assets和res/raw工程目录下都可以放一些小于1M的文件(2.3版本以前要求,否则将不能读出数据。),这些文件将被打包到APK中应用使用。assets目录下的文件将不做任何处理...

2016-06-27 22:12:33 4459 0

原创 设计模式系列(四)建造者模式Builder

建造者模式将一个复杂对象的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。 Builder:为创建Product对象的各个部件指定抽象接口。 ConcreteBuilder:实现Builder的接口以构造和装配该产品的各个部件,定义并明确它所创建的表示,并提供一个检索产品的接口。 Dir...

2016-06-26 14:51:41 2851 1

原创 Activity启动过程源码分析

老罗的Android系统源码分析讲的很不错,网上有很不同层面多源码分析。了解细节,还是自己看源码最直接。个人并没有透彻的研究过Android系统,这一系列的博客就当是读Android源码笔记了。有不对的地方还请多指教。 startActivity方法 context调用startActivity(...

2016-06-26 09:10:21 3900 3

原创 Android的各种Drawable详解

android内置了如下几种Drawable类型:ColorDrawable、GradientDrawable、BitmapDrawable、 NinePatchDrawable、InsetDrawable、ClipDrawable、ScaleDrawable、 RotateDrawable、An...

2016-06-25 11:42:38 5597 0

原创 JAVA并发编程(一)JAVA线程池的使用

Java通过Executors提供四种线程池,分别为: newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。 newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。 ...

2016-06-24 10:20:56 1908 0

原创 Android屏幕适配

一、一些基本概念 1、长度(真实长度):英寸、inch 2、分辨率:density 每英寸像素数 dpi(密度) 3、像素:px 4、dip的公式:px /dip=dpi/160 所以 dip 类似于英寸、长度(dp=dip,sp类似于dip) dip=160*inch dip= 160/dpi ...

2016-06-23 22:41:26 4127 5

原创 算法系列(十)堆实现优先队列

堆实际上是一棵完全二叉树,其任何一非叶节点满足性质: Key[i]<=key[2i+1]&&Key[i]<=key[2i+2]或者Key[i]>=Key[2i+1]&&key>=key[2i+2] 即任何一非叶节点的关键字不大于或者不小于其左...

2016-06-22 15:16:06 3074 0

原创 Android差分升级原理和实现方式

增量升级的原理很简单,即首先将应用的旧版本Apk与新版本Apk做差分,得到更新的部分的补丁,例如旧版本的APK有20M,新版的有21M,更新的部分则可能只有1M左右,这里需要说明的是,得到的差分包大小并不是简单的相减,因为需要包含一些上下文相关的东西,使用差分升级的好处显而易见,那么你不需要下载完...

2016-06-21 21:08:10 16498 1

原创 Android的布局复用与优化

在布局优化中,Android的官方提到了这三种布局<include />、<merge />、<ViewStub />,并介绍了这三种布局各有的优势,下面也是简单说一下怎么使用. 1、布局重用<include /> 1)<include /&g...

2016-06-20 23:28:43 4475 0

原创 JUnit单元测试

JUnit 为基本类型和对象以及数组(基本类型或对象)提供了重载的断言方法。参数的顺序是期望值和实际值。可选的第一个值是错误情况的消息。有一个略微不同的断言是 assertThat 它需要的参数是一个可选的失败消息,实际返回值和一个 Matcher 对象。值得注意的是,预期的和实际的是相反的相比其...

2016-06-19 15:30:50 2677 2

原创 Android apk打包过程

android打包过程,下面这张图取自Android开发权威指南,非常清晰。 整个过程使用的工具有 名称 功能介绍 在操作系统中的路径 aapt Android资源打包工具 ${ANDROID_SDK_HOME}/platform-tools/appt aidl Android接口描述语言转化为....

2016-06-18 22:57:07 5247 0

原创 android Cursor的自动管理方式

新手在使用数据库的时候,很容易忘记关闭Cursor,造成严重内存泄漏。有什么好的方法解决这个问题呢?除了自己管理Cursor,有什么办法把Cursor交给系统管理,而不需要自己主动close呢?manageQuery可以为你维护这个cursor。在你退出activity时为你自动关闭。 The...

2016-06-17 21:43:39 6272 0

原创 Java编译时注解自动生成代码

在开始之前,我们首先申明一个非常重要的问题:我们并不讨论那些在运行时(Runtime)通过反射机制运行处理的注解,而是讨论在编译时(Compile time)处理的注解。注解处理器是一个在javac中的,用来编译时扫描和处理的注解的工具。可以为特定的注解,注册自己的注解处理器。 一个注解的注解处理...

2016-06-16 21:31:11 9793 9

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