自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

binaryshao

学习成长,永不止步 >>>

  • 博客(72)
  • 收藏
  • 关注

原创 开源项目【WanAndroid_Flutter】玩安卓 Flutter 版

WanAndroid_Flutter项目地址玩安卓客户端 Flutter 版,可以查看各种开发相关的知识,适配了 Android 和 iOS,内容比较完整封装了加载中、空数据、错误、到达最底部等不同状态的视图,在错误时可以点击重新加载,具有较好的用户体验如果觉得项目还不错,点个 star 鼓励下作者吧 o(╥﹏╥)o也欢迎大家发起 issue 或提交 PR业务内容几乎对接了玩安卓的所...

2019-08-19 11:18:45 554 2

原创 开源项目【WanAndroid_RN】玩安卓 React Native 版

WanAndroid_RN玩安卓客户端 React-Native 版,可以查看各种开发相关的知识,适配了 Android 和 iOS,内容比较完整封装了加载中、空数据、错误、到达最底部等不同状态的视图,在错误时可以点击重新加载,具有较好的用户体验如果觉得项目还不错,点个 star 鼓励下作者吧 o(╥﹏╥)o也欢迎大家发起 issue 或提交 PR业务内容几乎对接了玩安卓的所有 API...

2019-07-31 06:50:53 454

原创 MVVM 架构解析及 Jetpack 架构组件的使用

谈到 MVVM 架构,不得不祭出官方的架构图,如下所示:在实践中,根据对架构组件 paging 的使用和理解,笔者又将架构图扩展成下面这样:.png有背景颜色的3处是使用 paging 组件需要多用到的MVVM 和 MVP 的区别MVP 中 V 层和 P 层互相持有对方的引用,在V 层调用 P 层逻辑后,P 层回调V 层的相应方法更新 UI。而在 MVVM 中,上层只依赖直接下层,...

2019-05-21 21:40:57 9989 2

原创 开源项目【WanAndroid-MVVM】玩安卓 Kotlin 版 (MVVM 架构)

WanAndroid-MVVM玩 Android 客户端,采用 kotlin 语言,Material Design 风格,根据 MVVM 架构使用 Jetpack 架构组件搭建了整套框架持续更新ing~后续有时间再根据本项目分析 MVVM 架构,敬请关注~Jetpack 使用情况DataBindingNavigationLiveDataViewModelPagingRoom ...

2019-04-29 16:08:03 1439

原创 算法的复杂度分析到底是什么?

数组它可以说是最基础、最简单的数据结构了数组用一块连续的内存空间,来存储相同类型的一组数据最大的特点就是支持随机访问,时间复杂度为 O(1)但插入、删除操作也因此变得比较低效,平均情况时间复杂度为 O(n)在平时的业务开发中,我们可以直接使用编程语言提供的容器类,但是,如果是特别底层的开发,直接使用数组可能会更合适,因为容器类无法存储基本类型,对包装类的装箱拆箱会有一定的性能损耗为什...

2019-03-19 17:55:21 713

原创 使用 AIDL 进行 IPC 的流程解析和其他要点

AIDL 文件并不是必需的,只是有了这个文件,系统会帮助我们自动生成 IRemoteService.java 这个类AIDL 的包结构在服务端和客户端要保持一致,否则反序列化将会失败!IRemoteServiceStub抽象内部类,继承了 Binder,实现了 IRemoteServicestatic abstractProxystatic内部类代理,实现了 IRemoteSe...

2019-02-12 23:59:10 394

原创 序列化接口 Serializable 和 Parcelable

Serializable反射?serialVersionUID确保反序列化成功的关键 ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L; * It is also strongly advised that explicit * serialVersionUID declarations use the <...

2019-01-17 15:17:04 451

原创 Gradle 在 Android 中的应用

Gradle 是什么Gradle 是 Android 项目的默认构建系统,它以领域特定语言 (DSL) —— Groovy 语言描述和操作构建逻辑。Groovy 是一种适用于 Java 虚拟机 (JVM) 的动态语言,它的语法和Java非常相似,并且完全兼容Java。Android APK 的构建流程如下所示,Gradle 就是帮助我们自动实现这一流程的工具。需要注意的是,Gradle ...

2019-01-05 23:14:58 721

原创 Flask 个人网站重构上线

之前在服务器上部署了几个 Python 项目,个人网站也已经运行一年多了最近抽空整理了几个项目,重新写了网站项目,又部署上线了网站地址点这个说实话,是个相对单调的网站:自我介绍 + 一个博客项目值此重构上线之际,记录点心得系统架构nginx反向代理 、静态文件、负载均衡当有n个项目运行在同一服务器的不同端口时,通过配置 nginx,能以下列两种方式进入这些不同的项目:以不同的域...

2018-12-26 17:33:52 364

原创 Fragment返回栈的手动管理

如何回到上一个Fragment项目开中需要经常在不同的Fragment之间跳转,随时可能从一个Fragment页面跳到另一个Fragment页面。这些页面的切换还是比较简单的,根据业务需求,相应地调用FragmentTransaction的show()、add()、hide()、replace()等方法,再提交事务就可以了。当页面不是很多时,这种方法足以应付了。但“返回上一页”这种需求随着...

2018-10-25 17:47:13 1668

原创 RoundingMode——Java中小数的舍位

RoundingMode 在 Java 中是一个枚举类,用来指定小数的舍位方式,共有8种对于这些舍位方式,之前用过却理解地很模糊最近一研究,又顿悟了!那一瞬间,我知道该把这些理解封印在这篇博客里了先来看一下常用的两种舍位写法,直接上代码两种舍位写法DecimalFormatDecimalFormat myformat = new DecimalFormat();myformat.s...

2018-09-21 16:36:02 3535

原创 HTTP / HTTPS 的一些相关理解

7层模型应用层HTTP、FTP、SMTP、POP3、DNS、DHCP 等表示层加密解密、转换翻译、压缩解压缩等会话层SSL(安全套接字层协议)、TLS(传输层安全协议)、RPC(远程过程调用协议)传输层端口到端口、端口(16位二进制,0到1023被系统占用)、TCP (传输控制协议)、UDP(用户数据报协议)网络层主机到主机、IP...

2018-09-19 16:41:14 581

原创 Python项目模块命名问题

Python项目中模块名不要和别的库名相同,以免想导入别的库时却导入了自己项目中的模块,表面上还看不出问题所在!!!

2018-08-07 17:25:15 3074

原创 常用查找算法总结

静态查找和动态查找这是针对查找表而言的动态表指查找表中有删除和插入操作的表无序查找和有序查找无序查找:被查找数列有序无序均可有序查找:被查找数列必须为有序数列平均查找长度(Average Search Length,ASL)顺序查找适用于存储结构为顺序存储或链接存储、数据量大不的线性表时间复杂度:O(n)二分查找也称为折半查找,这是一种有...

2018-08-06 15:44:56 379

原创 常用排序算法总结

排序算法的稳定性当待排序记录的关键字均不相同时,排序结果是惟一的,否则排序结果不唯一在待排序记录中,若存在多个关键字相同的记录,若排序前后这些具有相同关键字的记录之间的相对次序保持不变,则该排序方法是稳定的;否则就是不稳定的算法的就地性在运行过程中临时占用的存储空间随算法的不同而异,有的算法只需要占用少量的临时工作单元,而且不随问题规模的大小而改变,这是节省存储的算法...

2018-07-03 06:25:55 351

原创 Java集合框架(JCF)归纳总结

HashSet底层用`HashMap`实现允许`null`值不重复原理:HashMap.keySet(),`HashSet`的值用作`HashMap`的键TreeSetTreeMap排序,插入时比较次序,红黑树为了实现排序,须满足以下1条:TreeSet中的元素须实现Comparable接口或者构造TreeSet时须传入实现Comparable接口的类的对象...

2018-06-21 07:08:44 5710

原创 “数据结构”的个人理解

数据结构的实现可以分为3个层次: 1. 抽象出某种结构中数据的组织方式和该结构操作数据的方式, 可使用图形表示,但不涉及具体如何实现具体到某种编程语言中(比如java),根据某种数据结构抽象出接口, 以展现出该结构操作数据的方式,比如java集合框架中的Collection、LIST等接口 此时的抽象可以再将某种数据结构抽象出几种不同特性的结构,比如SET和LIST接口编写...

2018-06-12 18:10:03 773

原创 从源码看ThreadLocal的底层结构

引言set()get()总结

2018-05-27 19:34:01 1277

原创 MySQL——查

子句总结组合查询组合查询是指利用UNION,将多条SELECT查询语句组合在一起,并将结果作为单个结果集返回。它可以简化复杂的WHERE子句、多表查询工作,有以下要求或特性:每个查询必须包含相同的列、表达式或聚集函数(各个列的列出次序可以不同)返回结果为每个查询的WHERE子句过滤后的或集,并且和单条SELECT语句一样,去除了重复的行ORDER BY排序子句只能放在...

2018-04-14 18:18:17 329

原创 MySQL——增改删

MySQL——增可以省略表定义中允许NULL值(无值或空值)或给出默认值的列,其他列不能省略,否则插入将失败并报错。INSERT [LOW_PRIORITY] INTO table_name(c1, c2, c3, c4, c5)VALUES('a', 'b', 'c', 'd', 'e'),('1', '2', '3', '4', '5');LOW_PRIORITY 表示降...

2018-04-14 18:17:32 467

原创 MySQL——表操作

建表CREATE TABLE table_name IF NOT EXISTS(cust_id int NOT NULL AUTO_INCREMENT,cust_name char(50) NOT NULL,cust_city char(50) NULL DEFAULT 'hangzhou',cust_email char(50) ...

2018-04-14 18:16:26 327

原创 MySQL——通用操作

查看编码show variables like '%char%';显示所有数据库show databases;切换数据库use 数据库名;显示所有表show tables; 显示数据表的属性等信息show columns from 表名;或desc 表名;查看建表语句show create table 表名;或sho...

2018-04-14 18:14:26 253

原创 【源码分析】RxJava 1.2.2 实现简单事件流的原理

目前RxJava已经被广泛用于Android开发中,GitHub地址在这,官方文档说2018.03.31停止维护1.x 版本,本篇文章基于RxJava 1.2.2。关于RxJava的介绍文章推荐看扔物线的给 Android 开发者的 RxJava 详解,这篇文章讲解了很多使用方法、结论和部分原理,虽然是两年前的文章,但现在看还是有不少的收获。常用的类和接口在正式开始分析之前,我们先...

2018-04-01 18:30:19 677

原创 okhttp 3.4.2 拦截器使用总结

16年写过一篇RxJava+Retrofit+OkHttp组合在网络请求中的简单配置,本篇文章可以当作对它的补充。okhttp拦截器作为它的重要一员,如果好好利用往往能使我们事半功倍,先看一下拦截器的核心接口Interceptor:public interface Interceptor { Response intercept(Chain chain) throws IOExce...

2018-03-10 10:17:03 795

原创 【源码分析】Android消息机制:Handler发出的消息经历了怎样的流程

消息机制在Android中很重要,网上也有很多优质的分析文章,但很多人看了以后可能还是一头雾水,看着眼花缭乱的源码懵圈。本文不会介绍Looper、Handler、MessageQueue是什么,请读者自行了解相关基础知识。在这里笔者试图通过尽可能少的源码,分析Handler发出的消息经历了怎样的流程,Looper、Handler、MessageQueue又是如何紧密合作实现这一流程,以便大...

2018-03-03 23:01:46 266

原创 Android中线程的那些关系

去年画了张图,总结了一下Android中线程涉及到的一些方面,本来还想着写几篇博客分析的,奈何实在是精力有限,一直没写下去,估计以后也没精力写这个主题的文章了。今天是农历新年,是时候把这个坑填回去了,就贴出我总结的图吧。如有错误,欢迎赐教。新年快乐!

2018-02-15 16:52:22 289

原创 深入认识adb工具

前言官方文档本篇文章是对官方文档的理解和总结,大部分内容来自官方文档。adb即Android 调试桥,是一个通用命令行工具,其允许我们与模拟器实例或连接的 Android 设备进行通信。和Git、MySQL等一样,adb也有图形化工具,给我们更友好的交互体验。但不管是Android Studio开发环境还是豌豆荚等工具,实质都是用的adb命令和设备通信。因此,真正去了解ad

2018-01-23 23:37:40 1072

原创 蓝牙通信之保证数据的完整性

由来之前写过一篇Android蓝牙通信的文章,介绍了Android蓝牙的使用和一款蓝牙聊天app的原理,可以点这里看这篇文章。这篇文章是对上篇文章的完善和补充。原有问题上篇文章在分析蓝牙聊天app时提到过“管理连接线程”,在该线程中无限循环读取 InputStream,如果读取异常,说明蓝牙中断。 而读取的方法也很简单,直接读取数据到字节数组中:byte[] buffer =

2017-12-25 17:04:31 2055

原创 Bitmap转为单色位图,打印电子签名

背景项目中使用手写板,用户在上面签名后,将电子签名传到后台,同时将签名连同别的信息打印出来。手写板已经有很多优秀的开源库,也可以动手撸一个。手写板签名后可以得到签名的Bitmap,而所用的硬件是有打印接口的,可以接收Bitmap为参数打印图片,这样看似需求就能实现了。问题但打印接口接收的Bitmap必须是单色位图,类似于二维码,每个像素点非黑即白,非1即0。其实我们在使用zxing生成二维码时,也利

2017-11-10 21:22:55 3082

原创 List的add方法隐藏的坑

在一个List中add()了一个对象后,之后再没有改变这个List,某个时间点取出List中的数据, 却发现取出的数据已经发生了变化。这个bug排查了好久,才发现是因为当初add的对象在别的类中被改变了!这就是List的add方法隐藏的坑,且当原对象不在一个类中时,bug原因不容易被发现。原来当我们调用add()或addAll()方法时,添加的是引用,当原对象改变时,list中的数据会相应改变。来看

2017-10-19 23:28:54 3330

原创 神奇的Python装饰器

在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator)。Python装饰器接收一个函数,返回另一个函数。它其实是一个闭包(嵌套定义在非全局作用域里面的函数能够记住它在被定义的时候它所处的封闭命名空间),闭包的作用在下面的装饰器使用中可以感受到,而返回的函数就是装饰过的函数,它可以给原函数增加一些附加功能,而不影响原函数的调用方式,简直优雅至极!增加函数功能假设有这么个简单的函数,打

2017-09-30 18:02:19 592

原创 Android原生时间控件DatePicker——月份由英文转数字

网上有很多优秀的开源时间控件,可以满足我们大部分的需求。但有时候还是会碰到系统自带的DatePicker,这个控件默认的月份显示为英文,如JANUARY、FEBRUARY等。如何将月份由英文改成数字,这是个好玩的问题。庖丁解牛DatePicker并没有提供相关api可以实现我们的需求,所以需要我们自己来分析。查看DatePicke的源码,它的布局文件是date_picker.xml,如下所示:<Li

2017-08-28 16:54:45 4802

原创 【源码分析】Android触摸事件的分发拦截

Android中View的分发拦截机制是一块重要的内容,网上也有很多大神进行过相关的分析。 在这篇文章里我将以自己的理解尽量全面地分析整个流程,有些分析结果是很多文章没有提及的。 整个分析过程将通过demo与源码进行,做到有理有据。demo结构这个demo的地址在这儿首先要知道,ViewGroup的相关方法有dispatchTouchEvent、onInterceptTouch...

2017-07-09 18:26:05 474

原创 【源码分析】走进EventBus

简介EventBus被广泛用于Android组件之间的通讯,源码点这里,当前的最新版本为3.0.0,该版本发布于2016.02.05。 它的大致原理如下图: 根据官方的描述,它具有轻巧快速、解耦事件发送者和接收者、在各组件都运行稳定、避免了复杂的生命周期问题等等优点。使用方法它的使用方法很简单,相信大部分人都会了,在此赘述一下: 添加EventBus的依赖后,再进行如下3...

2017-06-01 07:31:50 454

原创 【源码分析】CountDownTimer倒计时为何如此优雅

CountDownTimer是一个抽象类,它有两个抽象方法需要调用者去实现。 我们可以直接以匿名类形式使用:new CountDownTimer(50 * 1000, 2 * 1000) { @Override public void onTick(long millisUntilFinished) { /...

2017-05-05 22:43:39 515

原创 JsonDeserializer——Gson自定义解析类型错误的字段

在开发中,定义好实体类和相应字段,Gson就可以很方便地帮助我们实现序列化和反序列化。可是有时候,后台传给客户端的json数据格式有误,其中的某些字段可能不是合理的类型,即,和我们在实体类中定义的字段类型不一致,此时就会出现类型转换错误,app原地爆炸!如何解决这一问题?最好的办法当然是后台确保数据类型正确,从源头上消灭问题。作为客户端开发,我们也要做好错误处理,应对各种场景。

2017-04-23 10:53:21 17020 3

原创 Instant Run导致ClassNotFoundException

最近一个项目运行时出现了ClassNotFoundException,感觉有点像是64k问题,但很快排除了。而此处这个问题是apk文件在经过某种签名后才有,没有这种签名就不会出现。最后关闭了AS中的Instant Run,重新打包才解决了这个问题。Instant Run虽好,使用需谨慎。这个issue在AOSP上也有很多问答:https://code.google.com/p/android/iss

2017-04-14 07:29:26 1014

原创 Android设备的蓝牙通信

设置蓝牙我们都知道,在手机的设置-蓝牙中,可以进行蓝牙设置的相关操作。其实可以不离开自己的APP,直接完成蓝牙设置的主要操作,可以结合自己的业务需求,相应地提示用户开启相关设置,提升用户体验。首先要知道,蓝牙连接需要知道待连接设备的MAC地址。已配对设备的MAC地址是已知的,只要对方开启了蓝牙并在连接范围内,就能连接成功。未配对设备则需要通过搜索才能知道MAC地址,知道MAC地址后如果直接请求和对方

2017-03-25 23:45:21 2029

原创 开源库【GuideView】功能引导视图,支持fragment,只显示一次,接入超简单顺滑

写在前面其实已经有很多类似的开源库,比较满意的是这个库:https://github.com/qiushi123/GuideView-master,但它实现的效果和使用方式不是很6,本来是想对这个库提交PR,但发现改动有点小多,所以自己另写了这个库。同时鸿神的这个库https://github.com/hongyangAndroid/Highlight 也不错,但可能我用的姿势不对,出现了...

2017-03-07 23:01:03 5108 10

原创 Android 混淆 (不定期完善第三方混淆规则)

开启混淆在AS中,借助于SDK中自带的Proguard工具,开启混淆只需要在release闭包中添加如下两行代码: release { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rule

2017-02-11 16:38:22 4238

空空如也

空空如也

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

TA关注的人

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