自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

你好,开发者

请移步公众号「开发者如是说」

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

原创 Android 内存缓存框架 LruCache 的源码分析

LruCache 是 Android 提供的一种基于内存的缓存框架。LRU 是 Least Recently Used 的缩写,即最近最少使用。当一块内存最近很少使用的时候就会被从缓存中移除。在这篇文章中,我们会先简单介绍 LruCache 的使用,然后我们会对它的源码进行分析。1、基本的使用示例首先,让我们来简单介绍一下如何使用 LruCache 实现内存缓存。下面是 LruCache 的一...

2018-11-13 12:56:43 775

原创 Android EventBus 的源码解析

1、EventBus 的使用1.1 EventBus 简介EventBus 是一款用于 Android 的事件发布-订阅总线,由 GreenRobot 开发,Gihub 地址是:EventBus。它简化了应用程序内各个组件之间进行通信的复杂度,尤其是碎片之间进行通信的问题,可以避免由于使用广播通信而带来的诸多不便。首先是 EventBus 的三个重要角色Event:事件,它可以是任意类型...

2018-11-12 00:14:49 778

原创 迁移到 AndroidX 过程中遇到的各种问题

关于 AndroidX,可以参考: Hello world AndroidXAndroidX 用来统一 Android 中的 support 包,之前我们通过引入 support 包的各个版本来使用支持包,现在我们可以通过使用 AndroidX 来使用支持包。从长远来看这当然是大有好处的,可以避免使用支持包中遇到的版本冲突、升级带来的各种问题。不过,如果项目完全迁移到 AndroidX 风险...

2018-11-10 14:13:18 28682 5

原创 MySQL-1:基础知识总结

1、概述目前属于Oracle,分成社区版和企业版,关系型数据库。1.1 目录结构bin:存储可执行文件data:存储数据文件doc:文档include:存储包含头文件lib:存储库文件share:错误消息和字符集配置文件:my.ini1.2 启动和停止在win cmd中使用net start/stop mysql来启动和停止mysql服务1.3 登入和登出1.3.1 ...

2018-11-08 11:58:07 828

原创 Java-8:五分钟学习行为参数化

1、概览Java8的改进比历史上任何一次改变都比较深远。Java不断改进也是编程语言生态变化的使然——诸如大数据需要在多核上面运行,而Java此前是不支持这种操作的。在Java8之前,如果想要利用多个计算机的内核,你要使用线程,并且要处理复杂的同步逻辑。但是在Java8中,你可以很容易地使用流让自己的代码在多个内核上面执行。此外,它还借鉴了其他语言和开源库的内容,比如Scala、Guava等...

2018-11-08 11:56:26 739

原创 Java-8:五分钟学习 Stream 编程

1、概述Java8中在Collection中增加了一个stream()方法,该方法返回一个Stream类型。我们就是用该Stream来进行流编程的;流与集合不同,流是只有在按需计算的,而集合是已经创建完毕并存在缓存中的;流与迭代器一样都只能被遍历一次,如果想要再遍历一遍,则必须重新从数据源获取数据;外部迭代就是指需要用户去做迭代,内部迭代在库内完成的,无需用户实现;可以连接起来的流操作...

2018-11-08 11:55:04 1139

原创 Spring MVC 机制及其配置方式的总结

1、简介1.1 Web MVC在Web开发中,通常是浏览器发送请求到服务器,由服务器接收请求并将响应传递给客户端,并由客户端渲染之后展示给用户。因此,一般服务器是无法主动通知客户端更新内容的,虽然有些推送技术可以实现主动通知客户端。在标准的MVC里,服务器是可以主动将数据推送给客户端的,但是实际的WebMVC是做不到的,如果用户想要视图更新,需要再发送一次请求。Web端的开发经历了从CGI...

2018-11-08 11:53:02 767

原创 并发编程专题-4:ThreadLocal 原理解析

1、ThreadLocal的使用防止任务在共享资源上产生冲突的一种方式是根除对变量的共享,使用线程的本地存储为使用相同变量的不同线程创建不同的存储。下面是一个ThreadLocal的实例。这里我们使用了静态的全局变量ThreadLocal对象来保存Integer类型的值。我们在不同的线程中将指定的数字传入到threadLocal中进行保存。然后,再将其读取出来:private static...

2018-11-08 11:50:56 804

原创 Android 多线程编程:IntentService & HandlerThread

因为 Android 是使用 Java 开发的,所以当我们谈及 Android 中的多线程,必然绕不过 Java 中的多线程编程。但在这篇文章中,我们不会过多地分析 Java 中的多线程编程的知识。我们会在以后分析 Java 并发编程的时候分析 Java 中的多线程、线程池和并发 API 的用法。我们先来总结一下 Android 多线程编程的演变过程:首先是 Java 的 Thread。因为本身...

2018-11-05 22:22:05 848

原创 Exception java.lang.IllegalStateException: Cannot perform this operation because the connection pool

当我在多线程环境当中使用数据库的时候遇到了这个问题。这是我之间在 StackOverflow 上面的回答的答案:Avoiding Connection Pool Closed in SQLite。因为同一个 SQLiteOpenHelper 的 getWritableDatabase() 返回同一个 SQLiteDatabase 对象,所以当在多线程环境当中使用 SQLiteDatabase 的...

2018-11-05 18:32:22 6602

原创 常用的 Java 第三方库 JodaTime

Java8之前的时间库中存在一些设计不好的地方,导致用起来非常地不方便,又容易出错。比如,要实现在指定的日期的基础上面增加指定的时间的操作,你需要些大量的样板代码;而它的月份从0开始,稍有不慎就会掉入坑中。所以,通常我们使用第三方库Joda Time来进行时间相关的操作。1、使用JodaTimeJodaTime在Github上面的主页:JodaTime使用JodaTime的时候的两种配置方式...

2018-11-05 18:19:57 1215

原创 马克笔记—Android 端开源的 Markdown 笔记应用

马克笔记是运行在Android设备上面的一款开源的Markdown笔记,它的功能开发得已经比较完善,已经能够满足大部分用户的需求。现在将其开源到Github上面,用来交流和学习。当然,更希望你能够参与到项目的开发当中,帮助马克笔记变得更加有用。1、关于马克笔记马克笔记是一款开源的Markdown笔记应用,它的界面设计采用了Google最新的Material Design风格。该笔记现在的功...

2018-11-05 18:18:25 3923 2

原创 JVM 系列-1:虚拟机内存管理

1、关于JavaJava程序设计语言、Java虚拟机、Java API类库这三部分统称为JDK,JDK是用于支持Java程序开发的最小环境。Java API类库中的Java SE API子集和Java虚拟机这两部分统称为JRE,JRE是支持Java程序运行的标准环境。HotSpot是目前使用最为广泛的虚拟机。Java以后发展的几个方向:1).模块化,功能组件可插拔;2).混合语言:各不同的...

2018-11-05 18:14:06 830

原创 JVM 系列-2:虚拟机执行子系统

1、类文件结构Java虚拟机只与Class文件相关联,它规定了Class文件应该具有的格式,而不论该文件是由什么语言编写并编译而来。所以,任何语言只要能够最终编译成符合Java虚拟机要求的Class文件,就可以运行在Java虚拟机上面。就是说,不论是使用Java, Scala, Kotlin, Groovy还是其他语言,只要编译出的Class文件符合虚拟机规范,那么都可以被虚拟机执行。所以,实际...

2018-11-05 18:13:26 729

原创 JVM 系列-3:虚拟机内存模型与高效并发

当多个线程访问同一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替运行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获取正确的结果,那这个对象是线程安全的。关于定义的理解这是一个仁者见仁智者见智的事情。出现线程安全的问题一般是因为主内存和工作内存数据不一致性和重排序导致的,而解决线程安全的问题最重要的就是理解这两种问题是怎么来的,那么,理解它们的...

2018-11-05 18:12:02 701

原创 设计模式-观察者模式

1、接口回调在学习观察者模式之前,我们先了解一下接口回调的概念。两者的原理有些类似,理解了接口回调就非常容易理解观察者模式。所谓接口回调一般应用的场合是:你不知道这个方法什么时候回返回,但是你希望在该方法结束的时候拿到方法执行的结果。常见的,比如一个方法内部开启了线程,而我们希望在线程执行结束的时候拿到线程的执行结果。在下面的例子中,方法cal()定义了一个局部变量i,随后开启了一个线程,并...

2018-11-05 18:10:32 706

原创 Android AsyncTask 源码分析

1、AsyncTask的使用使用AsyncTask可以更加简单地实现任务的异步执行,以及任务执行完毕之后与主线程的交互。它被设计用来执行耗时比较短的任务,通常是几秒种的那种,如果要执行耗时比较长的任务,那么就应该使用JUC包中的框架,比如ThreadPoolExecutor和FutureTask等。AsyncTask用来在后台线程中执行任务,当任务执行完毕之后将结果发送到主线程当中。它有三个重...

2018-11-05 18:08:06 731

原创 Guava 源码分析之 EventBus 源码分析

EventBus的设计理念是基于观察者模式的,可以参考设计模式(1)—观察者模式先来了解该设计模式。1、程序示例EventBus的使用是非常简单的,首先你要添加Guava的依赖到自己的项目中。这里我们通过一个最基本的例子来说明EveentBus是如何使用的。public static void main(String...args) { // 定义一个EventBus对象,这里的Jo...

2018-11-04 19:08:14 878

原创 Android 架构设计:MVC、MVP、MVVM和组件化

MVC、MVP和MVVM是常见的三种架构设计模式,当前MVP和MVVM的使用相对比较广泛,当然MVC也并没有过时之说。而所谓的组件化就是指将应用根据业务需求划分成各个模块来进行开发,每个模块又可以编译成独立的APP进行开发。理论上讲,组件化和前面三种架构设计不是一个层次的。它们之间的关系是,组件化的各个组件可以使用前面三种架构设计。我们只有了解了这些架构设计的特点之后,才能在进行开发的时候选择适合...

2018-11-04 19:05:03 903

原创 RxJava2 系列-3:Subject 及其几种应用方式

在这篇文章中,我们会先分析一下 RxJava2 中的 Subject ;然后,我们会使用 Subject 制作一个类似于 EventBus 的全局的通信工具。在了解本篇文章的内容之前,你需要先了解 RxJava2 中的一些基本的用法,比如 Observable 以及背压的概念,你可以参考我的其他两篇文章来获取这部分内容:《RxJava2 系列 (1):一篇的比较全面的 RxJava2 方法总结》...

2018-11-04 18:54:44 1192

原创 RxJava2 系列-2:背压和 Flowable

背压(Back Pressure)的概念最初并不是在响应式编程中提出的,它最初用在流体力学中,指的是后端的压力,通常用于描述系统排出的流体在出口处或二次侧受到的与流动方向相反的压力。在响应式编程中,我们可以将产生信息的部分叫做上游或者叫生产者,处理产生的信息的部分叫做下游或者消费者。试想如果在异步的环境中,生产者的生产速度大于消费者的消费速度的时候,明显会出现生产过剩的情景,这时候就需要消费...

2018-11-04 18:53:27 1105

原创 RxJava2 系列-1:一篇的比较全面的 RxJava2 方法总结

看了许多讲解RxJava的文章,有些文章讲解的内容是基于第一个版本的,有些文章的讲解是通过比较常用的一些API和基础的概念进行讲解的。但是每次看到RxJava的类中的几十个方法的时候,总是感觉心里没底。所以,我打算自己去专门写篇文章来从API的角度系统地梳理一下RxJava的各种方法和用法。1、RxJava 基本1.1 RxJava 简介RxJava是一个在Java VM上使用可观测的序列...

2018-11-04 18:52:40 1259

原创 Android 消息机制:Handler、MessageQueue 和 Looper

在这篇文章中,我们将会讨论 Android 的消息机制。提到 Handler,有过一些 Android 开发经验的都应该很清楚它的作用,通常我们使用它来通知主线程更新 UI。但是 Handler 需要底层的 MessageQueue 和 Looper 来支持才能运作。这篇文章中,我们将会讨论它们三个之间的关系以及实现原理。在这篇文章中,因为涉及线程方面的东西,所以就避不开 ThreadLocal...

2018-11-04 18:30:30 1299

原创 Java 注解及其在 Android 中的应用

一般的,注解在 Android 中有两种应用方式,一种方式是基于反射的,即在程序的运行期间获取类信息进行反射调用;另一种是使用注解处理,在编译期间生成许多代码,然后在运行期间通过调用这些代码来实现目标功能。在本篇文章中,我们会先重温一下 Java 的注解相关的知识,然后分别介绍一下上面两种方式的实际应用。1、Java 注解回顾1. Java 注解的基础知识Java 中的注解分成标准注解和元...

2018-11-04 00:50:11 931

原创 Android 动画详解:属性动画、View 动画和帧动画

在 Android 中,基本的动画共有三种类型:View 动画:也叫视图动画或者补间动画,主要是指 android.view.animation 包下面的一些类,只能被用来设置给 View,缺点是比如当控件移动之后,接收点击的控件的位置不会跟随移动,并且能够实现的效果只有移动、缩放、旋转和淡入淡出操作四种及其组合。Drawable 动画:也叫 Frame 动画或者帧动画,其实可以划分到视图动...

2018-11-04 00:46:58 1156

原创 View 体系详解:坐标系、滑动、手势和事件分发机制

1、位置1.1 坐标系下面是 Android 中的 View 坐标系的基本图。要获得一个 View 的位置,我们可以借助两个对象,一个是 View ,一个是 MotionEvent。以下是它们的一些方法的位置的含义:在 View 中共有 mLeft, mRight, mTop 和 mBottom 四个变量包含 View 的坐标信息,你可以在源码中获取它们的含义:mLeft:指定控件的左...

2018-11-04 00:04:17 922

原创 View 体系详解:View 的工作流程

1、View 树的加载流程当我们调用 startActivity() 方法的时候,会调用到 ActivityThread 中的 performLaunchActivity() 获取一个 Activity 实例, 并在 Instrumentation 的 callActivityOnCreate() 方法中调用 Activity 的 onCreate() 完成 DecorView 的创建。这样我...

2018-11-04 00:03:25 966 1

原创 Andriod 网络框架 OkHttp 源码解析

1、OkHttp 的基本使用OkHttp 是 Square 的一款应用于 Android 和 Java 的 Http 和 Http/2 客户端。使用的时候只需要在 Gradle 里面加入下面一行依赖即可引入:implementation 'com.squareup.okhttp3:okhttp:3.11.0'我们知道,Http 请求有多种类型,常用的分为 Get 和 Post,而 POST...

2018-11-03 23:49:18 798

原创 Android 网络框架 Retrofit 源码解析

在之前的文章 《Andriod 网络框架 OkHttp 源码解析》 中我们分析了 OkHttp 的源代码。现在我们就来分析一下 OkHttp 的兄弟框架 Retrofit。关于 Retrofit 的注解的使用,可以参考其官方文档:https://square.github.io/retrofit/。Retrofit 也是 Square 发布的一个开源的库,它是一个类型安全的 Http 客户端,适...

2018-11-03 23:46:05 813

空空如也

空空如也

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

TA关注的人

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