自定义博客皮肤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编程

  • 博客(133)
  • 资源 (8)
  • 收藏
  • 关注

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

Volley是Google在2013年推出的一个网络库,用于解决复杂网络环境下网络请求问题。刚推出的时候是非常火的,现在该项目的变动已经很少了。项目库地址为https://android.googlesource.com/platform/frameworks/volley通过提交历史可以看到,最后一次修改距离今天已经有一段时间了。而volley包的release版本也已经很久没有更新了。author Jeff Davidson <[email protected]> Sun Mar 13 16:35:59

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

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

OTTO是Square推出的库,地址:https://github.com/square/ottoOTTO基于Guava项目的Android支持库,如果你在Android程序开发的过程中想要不同的组件之间进行有效的通信可以使用这个库。通过otto库可以。otto的官方介绍An enhanced Guava-based event bus with emphasis on Android support.Otto is an event bus designed to decouple differen

2016-06-10 21:59:21 7425

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

Retrofit2对Retrofit做了很大改进,做一下详细比对参考https://inthecheesefactory.com/blog/retrofit-2.0/en底层okhttp不同Retrofit 默认使用okhttpRetrofit2 默认使用okhttp3Service接口定义方式不同在Retrofit2之前如果定义一个同步的函数,应该这样定义:p

2016-06-04 23:33:01 13071

原创 Picasso的使用和源码解析

一、基本介绍picasso是Square公司开源的一个Android图片下载缓存库,github地址https://github.com/square/picasso,可以实现图片下载和缓存功能。Picassso的特点有:自动将图像缓存在本地,自带内存和硬盘二级缓存功能通过图片压缩转换以减少内存消耗自动处理了ImageView的回收,自动取消不在视野范围内的ImageV

2016-06-03 23:49:42 9204

原创 EventBus的使用和源码解析

基本介绍EventBus 是一个 Android 事件发布/订阅框架,通过解耦发布者和订阅者简化 Android 事件传递,这里的事件可以理解为消息,本文中统一称为事件。事件传递既可用于 Android 四大组件间通讯,也可以用户异步线程和主线程间通讯等等。EventBusEventBus3.0版本有较大的更新,性能上有很大提升。这里只介绍新版本。传统的事件传递方式包括:Handler

2016-06-01 00:59:13 10291

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

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

2019-08-21 16:09:32 760

原创 从代理模式到mockito原理

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

2019-05-09 14:31:05 1547

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

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

2017-01-11 10:52:15 5290

原创 Https简单介绍

一、HTTPS是什么  HTTPS(全称:Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。 它是一个URI scheme(抽象标识符体系),句法类同http:体系。用于安全的HTTP数据传输。ht

2017-01-07 10:25:20 3871

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

移动设备无线投屏到电视机主要有三种种技术:AirPlay、DLNA与Miracast技术。DNLA,Digital Living Network Alliance,是索尼、英特尔、微软等发起的一套 PC、移动设备、消费电器之间互联互通的协议。它们的宗旨是“随时随地享受音乐、照片和视频”。DLNA与苹果的AirPlay功能比较类似,协议也大体相同,他们都可以让你手机中的媒体内容投放到电视屏幕里。不同的是手机上的DLNA 并没有类似Apple TV的AirPlay 的镜像功能,也没有Apple TV 所支持

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

原创 微信小程序

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

2016-09-30 12:34:54 3272

原创 Android日志的使用技巧

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

2016-09-27 20:21:36 3691

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

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

2016-08-25 09:27:49 4403

原创 Realm使用简单介绍

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

2016-08-02 20:42:57 8273

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

SQL标准中有TRUNCATE TABLE语句,用来清空表的所有内容。但SQLite不支持这个语句。在SQLite中直接使用“DELETE FROM TableName”就可以了。对于大多数DBMS来说,用DELETE不如用TRUNCATE 速度快,因为TRUNCATE 不用访问整个表,不用记录数据的变动。SQLite虽然不支持TRUNCATE,但它对DELETE做了优化:“When the WHERE is omitted from a DELETE statement and the table be

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

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

使用简单标志位保存取消状态为了保证标志位可靠,标志必须为volatile类型。使用标志位来取消任务是不及时的,如果中间调用了阻塞方法,有可能永远都无法结束。每个线程都有一个boolean类型的中断状态,interrupt方法能中断目标线程,而isInterrupted方法能返回目标线程的中断状态,静态的interrupted方法将清除当前线程的中断状态,也是清除中断状态的唯一一个方法。在线上Java程序中经常遇到进程程挂掉,一些状态没有正确的保存下来,这时候就需要在JVM关掉的时候执行一些清理现场的

2016-07-16 00:00:10 6960

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

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

2016-07-11 14:49:20 5423

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

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

2016-07-10 19:16:20 8716

原创 Android中View绘制流程分析

在Activity的attach方法中通过调用PolicyManager.makeNewWindo创建Window,将一个View add到WindowManager时,WindowManagerImpl创建一个ViewRoot来管理该窗口的根View。并通过ViewRoot.setView方法把该View传给ViewRoot。Activity中的Window对象帮我们创建了一个PhoneWindow内部类DecorView(父类为FrameLayout)窗口顶层视图。WindowManagerImpl

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

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

Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。标准库中包括Set和Map的散列实现,即HashSet类和HashMap类。HashSet的实现直接借助了HashMap。JDK中是使用

2016-07-08 21:36:24 7023

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

Java提供了一种内置的锁机制来支持原子性:同步代码块(Synchronized Block)。内置锁的最小颗粒度是对象,修饰方法上的锁也是作用于对象。有时候叫它方法锁,但是实际上是锁住的对象。内置锁又被称为监视锁,线程在进入同步代码块之前会自动获得锁,推出时才释放锁,获得内置锁的唯一路径就是进入这个锁保护的同步代码块或者同步方法。最多只有一个线程可持有这种锁,所以它是线程安全的。当某个线程请求一个其他线程持有的锁时,发出请求的线程就会阻塞。但是如果某个线程视图获得一个已经由自己持有的锁,这是可以得。也

2016-07-06 22:18:26 3892

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

Android悬浮窗实现 实现基础Android悬浮窗实现使用WindowManager ,WindowManager介绍  通过Context.getSystemService(Context.WINDOW_SERVICE)可以获得 WindowManager对象。每一个WindowManager对象都和一个特定的 Display绑定。想要获取一个不同的display的W

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

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

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

2016-07-01 10:28:52 7135

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

BACK键:  当我们按BACK键时,我们这个应用程序将结束,这时候我们将先后调用onPause()->onStop()->onDestory()三个方法。再次启动App时,会执行onCreate()->onStart()->onResume()HOME键:  当我们打开应用程序时,比如浏览器,我正在浏览NBA新闻,看到一半时,我突然想听歌,这时候我们会选择按HOME键,然后去打开音乐应用程序,而当我们按HOME的时候,Activity先后执行了onPause()->onStop()这两个方法,这时

2016-07-01 10:12:42 7670

原创 Android进程分类与管理

Android采 取了一种有别于Linux的进程管理策略,有别于Linux的在进程活动停止后就结束该进程,Android把这些进程都保留在内存中,直到系统需要更多 内存为止。这些保留在内存中的进程通常情况下不会影响整体系统的运行速度,并且当用户再次激活这些进程时,提升了进程的启动速度。那Android什么时候结束进程?结束哪个进程呢?之前普遍的认识是Android是依据一个名为LRU(last recently used 最近使用过的程序)列表,将程序进行排序,并结束最早的进程。但实际上这里面有更多的细节

2016-06-30 13:53:05 6094

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

项目快速迭代过程中,不可避免的出现BUG,Android线上出现问题,通常需要发版解决。紧急发版,用户不一定升级,强制升级又不友好,有什么更好的解决方案呢?这就用到了热修复技术。QQ团队的hotfix,后来发展成为RocooFix,GitHub地址: https://github.com/dodola/HotFix原理详细介绍官方文章:安卓App热补丁动态修复技术介绍阿里巴巴的AndFix

2016-06-29 12:06:54 8973

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

一.AsyncQueryHandler的作用:异步的查询操作帮助类,它可以处理增删改查。当然也可以使用ContentProvider去操作数据库。这在数据量很小的时候是没有问题的,但是如果数据量大了,可能导致UI线程发生ANR事件。当然也可以写个Handler去做这些操作,只是每次使用ContentProvider时都要再写个Handler,必然降低了效率。因此API提供了一个操作数据库的通用方法。它提供:startInsert,startDelete,startUpdate,startQuery这四个操

2016-06-28 17:35:15 4917

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

res/raw和assets的相同点:两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制。assets和res/raw工程目录下都可以放一些小于1M的文件(2.3版本以前要求,否则将不能读出数据。),这些文件将被打包到APK中应用使用。assets目录下的文件将不做任何处理被打包,,如果你的资源很大,例如视频等等,应该单独存储在文件系统中。res/raw和assets的不同点:1.res/raw中的文件会被映射到R.java文件中,访问的时候直接使用资源ID即R.id.filena

2016-06-27 22:12:33 5456

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

建造者模式将一个复杂对象的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。Builder:为创建Product对象的各个部件指定抽象接口。ConcreteBuilder:实现Builder的接口以构造和装配该产品的各个部件,定义并明确它所创建的表示,并提供一个检索产品的接口。Director:构造一个使用Builer接口的对象。Product:表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程,包含定义组成部件的类,以及将这些部件装配成最终产品的接口

2016-06-26 14:51:41 3182 2

原创 Activity启动过程源码分析

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

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

原创 Android的各种Drawable详解

android内置了如下几种Drawable类型:ColorDrawable、GradientDrawable、BitmapDrawable、 NinePatchDrawable、InsetDrawable、ClipDrawable、ScaleDrawable、 RotateDrawable、AnimationDrawable、LayerDrawable、LevelListDrawable、 StateListDrawable、TransitionDrawableShapeDrawable。 An

2016-06-25 11:42:38 6360

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

Java通过Executors提供四种线程池,分别为:newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务

2016-06-24 10:20:56 2177

原创 Android屏幕适配

一、一些基本概念1、长度(真实长度):英寸、inch2、分辨率:density 每英寸像素数 dpi(密度)3、像素:px4、dip的公式:px /dip=dpi/160 所以 dip 类似于英寸、长度(dp=dip,sp类似于dip) dip=160*inchdip= 160/dpi * px当dip一定时,dpi 越大,px就越大5、广义分辨率=长px*宽px

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

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

堆实际上是一棵完全二叉树,其任何一非叶节点满足性质:Key[i]<=key[2i+1]&&Key[i]<=key[2i+2]或者Key[i]>=Key[2i+1]&&key>=key[2i+2]即任何一非叶节点的关键字不大于或者不小于其左右孩子节点的关键字。堆分为大顶堆和小顶堆,满足Key[i]>=Key[2i+1]&&key>=key[2i+2]称为大顶堆,满足 Key[i]<=key[2i+1]&&Key[i]<=key[2i+2]称为小顶堆。由上述性质可知大顶堆的堆顶的关键字肯定是所有关键字

2016-06-22 15:16:06 3518

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

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

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

原创 Android的布局复用与优化

在布局优化中,Android的官方提到了这三种布局<include />、<merge />、<ViewStub />,并介绍了这三种布局各有的优势,下面也是简单说一下怎么使用.1、布局重用<include />1)<include />标签可以使用单独的layout属性,这个也是必须使用的。2)标签若指定了ID属性,而你的layout也定义了ID,则你的layout的ID会被覆盖3)在include标签中所有的android:layout_*都是有效的,前提是必须要写layout_width和la

2016-06-20 23:28:43 5463

原创 JUnit单元测试

JUnit 为基本类型和对象以及数组(基本类型或对象)提供了重载的断言方法。参数的顺序是期望值和实际值。可选的第一个值是错误情况的消息。有一个略微不同的断言是 assertThat 它需要的参数是一个可选的失败消息,实际返回值和一个 Matcher 对象。值得注意的是,预期的和实际的是相反的相比其他断言方法。Assume直译为假设,是JUnit提供的一套用于判断测试用例的入参是否有业务含义的工具,如果入参不符合预期时会抛出AssumptionViolatedException,默认的BlockJUnit4

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

原创 Android apk打包过程

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

2016-06-18 22:57:07 5690

原创 android Cursor的自动管理方式

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

2016-06-17 21:43:39 6791

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

在开始之前,我们首先申明一个非常重要的问题:我们并不讨论那些在运行时(Runtime)通过反射机制运行处理的注解,而是讨论在编译时(Compile time)处理的注解。注解处理器是一个在javac中的,用来编译时扫描和处理的注解的工具。可以为特定的注解,注册自己的注解处理器。一个注解的注解处理器,以Java代码(或者编译过的字节码)作为输入,生成文件(通常是.java文件)作为输出。可以生成Java代码,这些生成的Java代码是在生成的.java文件中,所以不能修改已经存在的Java类,例如向已有的类中

2016-06-16 21:31:11 13237 12

Android内核

本书详细分析了Android内核的内部机制,包括窗口管理系统、Activity管理系统、输入法框架、编译系统等,为Android内核定制及高级应用程序开发提供技术参考。

2016-06-01

数据结构与算法分析_Java语言描述

“数据结构”是计算机专业的基础与核心课程之一,Java是现今一种热门的语言。本书在编写过程中特别考虑到了面向对象程序设计(OOP)的思想与Java语言的特性。它不是从基于另一种程序设计语言的数据结构教材简单地“改编”而来的,因此在数据结构的实现上更加“地道”地运用了Java语言,并且自始至终强调以面向对象的方式来思考、分析和解决问题。

2016-06-01

精通spring3电子版

本书是关于Spring 的权威教程,是Java/Java EE开发者必备的参考书。本书详尽、系统地介绍了Java EE的基础知识、Spring 的各种功能,以及Spring 的高级使用技巧和最佳实践。

2016-06-01

Android反编译

一键反编译andorid源码

2016-05-27

Android夜间护眼模式源码

Android夜间护眼模式源代码,可调节屏幕整体的亮度跟颜色。

2015-01-06

VC++使用ADO在数据库中访问记录

使用ado访问Access数据库。比较基本,适合初学者。

2012-04-22

MFC记事本vc6.0下开发

MFC下记事本程序,有一丁点BUG,偶尔会有乱码。功能很多,字体设置,背景颜色,状态栏也是自己设置的,同时还可以托盘

2011-08-29

MFC下udp网络聊天小程序

VC6.0下MFC编程,基于UDP的网络聊天程序

2011-08-28

空空如也

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

TA关注的人

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