自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

欢迎交流

一个假的程序猿

  • 博客(85)
  • 问答 (1)
  • 收藏
  • 关注

原创 结构型-适配器模式

定义:适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。适配器模式分为类结构型模式和对象结构型模式两种,前者类之间的耦合度比后者高,且要求程序员了解现有组件库中的相关组件的内部结构,所以应用相对较少些。模式的应用场景以前开发的系统存在满足新系统功能需求的类,但其接口同新系统的接口不一致。使用第三方提供的组件,但组件接口定义和自己要求的接口定义不同。优点客户端通过适配器可以透明地调用目标接口。复用了现存的类,程序员不需要

2021-07-31 14:27:02 203

原创 SharedPreferense原理和缺陷分析

SharedPreferense 实现原理简介SharedPreferences是Android提供给我们的用于存储轻量级K-V数据的持久化方案。以XML文件的形式存储在/data/data/packageName/的shared_prefs文件夹。它提供了 putString()、putString(Set)、putInt()、putLong()、putFloat()、putBoolean() 六种数据类型。(注意没有Double)使用示例//根据文件名,获取SharedPreferences对

2021-07-31 13:45:22 767

原创 设计模式的六大原则

一、单一职责原则—优化代码第一步定义就一个类而言,应该仅有一个引起它变化的原因。优点可以降低类的复杂度,一个类只负责一项职责,其逻辑肯定要比负责多项职责简单的多;提高类的可读性,提高系统的可维护性;变更引起的风险降低,变更是必然的,如果单一职责原则遵守的好,当修改一个功能时,可以显著降低对其他功能的影响。缺点一个职责的变化可能会削弱或者抑制这个类实现其他职责的能力;当客户端需要该对象的某一个职责时,不得不将其他不需要的职责全都包含进来,从而造成冗余代码或代码的浪费。实现需要设计

2021-07-01 17:08:18 213

原创 设计模式概述和UML图

设计模式概述分类设计模式有两种分类方法,即根据模式的目的来分和根据模式的作用的范围来分。根据目的来分。根据模式是用来完成什么工作来划分,这种方式可分为创建型模式、结构型模式和行为型模式 3 种。创建型模式:用于描述“怎样创建对象”,它的主要特点是“将对象的创建与使用分离”。GoF 中提供了单例、原型、工厂方法、抽象工厂、建造者等 5 种创建型模式。结构型模式:用于描述如何将类或对象按某种布局组成更大的结构,GoF 中提供了代理、适配器、桥接、装饰、外观、享元、组合等 7 种结构型模式。行为

2021-07-01 16:28:57 294 1

原创 Glide 4.8.0缓存分析

上一篇讲了Glide加载图片的基本过程 Glide基本加载流程源码分析这一篇详细分析一下Glide的缓存实现。Glide缓存和其他的图片缓存框架类似都是用到内存缓存和硬盘缓存两种。缓存Key既然是缓存功能,就必然会有用于进行缓存的Key。Glide的缓存key生成非常麻烦,一共近十个参数共同决定。生成缓存Key的代码在Engine类的load()方法当中,这部分代码我们在上一篇文章当中已经分析过了,只不过当时没有仔细关注缓存部分内容。现在重新看下Engine类的load()方法实现:public

2020-11-04 09:19:05 325

原创 Glide 4.8.0基本加载流程源码分析

基本使用Glide.with(this).load(url).into(imageView);首先,调用Glide.with()方法用于创建一个加载图片的实例。with()方法可以接收Context、Activity或者Fragment类型的参数。也就是说我们选择的范围非常广,不管是在Activity还是Fragment中调用with()方法,都可以直接传this。那如果调用的地方既不在Activity中也不在Fragment中呢?也没关系,我们可以获取当前应用程序的ApplicationContex

2020-11-04 09:15:31 288

原创 RxJava2如何实现链式调用和线程切换

线程切换背压背压在计算机系统中指网络拥塞信息逆流通过。在rxjava中理解为:被观察者发送消息太快以至于它的操作符或者订阅者不能及时处理相关的消息,从而操作消息的阻塞现象。在RxJava2.0中官方,推出了Flowable 和Subscriber用来支持背压,同样的去除了Observable对背压的支持,对的就像你上面看到的,Observable不再支持背压了,即使阻塞崩溃也不会抛出Miss...

2020-05-02 17:55:57 1935

原创 EventBus的简单和原理

基本介绍EventBus是一款针对Android优化的发布/订阅事件总线。主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传递消息.优点是开销小,代码更优雅。以及将发送者和接收者解耦。源码基本使用自定义一个类,用于发送和接收信息。构造时传入要发送的信息,然后get方法返回信息。(也可以是空类).例如:p...

2020-05-02 17:51:34 669

原创 Retrofit简单使用

Retrofit学习笔记Retrofit基础Retrofit 中使用注解的方式来区分请求类型,比如@GET("/record")表示一个GET请求,要以 / 开头,会拼接到基本URL后面,record为接口地址。各个格式和含义如下:例如,GET请求(其他请求类似): @GET("/apistore/mobilenumber/mobilenumber") Ca...

2020-05-02 17:45:25 379

原创 okHttp使用和原理分析

基本用法GET在okHttp,每次网络请求就是一个Request,在Request里填写我们需要的url、header等其他参数,再通过OkHttpClien构造出Call,Call内部传入请求参数,得到回复,并将结果告诉调用者。通过同步的方法去操作网络请求同步方法是在当前线程的,所以要开一个子线程去访问网络通过异步的方式:在同步的基础上将execute改成enqueue,...

2020-05-02 17:41:47 460

原创 图片加载框架Glide简单使用和缓存原理

基本使用流程Glide最基本的使用流程就是下面这行代码,其它所有扩展的额外功能都是以其建造者链式调用的基础上增加的。GlideApp.with(context).load(url).into(iv);其中的GlideApp是注解处理器自动生成的,要使用GlideApp,必须先配置应用的AppGlideModule模块,里面可以为空配置,也可以根据实际情况添加指定配置。@GlideModu...

2020-05-02 17:26:10 790

原创 GreenDao简单使用

简介greenDAO 是一个将对象映射到 SQLite 数据库中的轻量且快速的 ORM 解决方案。GreenDao特点:性能最大化,可能是Android平台上最快的ORM框架易于使用的API最小的内存开销依赖体积小支持数据库加密强大的社区支持使用配置在工程的build.gradle中配置,添加依赖插件buildscript { repositori...

2020-05-02 16:46:58 549

原创 设计模式学习-生成器模式(Builder).md

定义:一步一步创建一个复杂对象的创建模型,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。使用场景:相同的方法,不同的执行顺序,产生不同的结果时;多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同;产品类非常复杂,或者产品类中的调用顺序不用产生了不同的作用;当初始化一个对象特别复杂,如参数多,且很多参数都具有默认值。实例,参...

2020-05-02 15:57:20 149

原创 TCP和UPD详解

UDP 和 TCP 的特点(区别)用户数据报协议 UDP(User Datagram Protocol)是==无连接==的,==尽最大可能交付==,==没有拥塞控制==,==面向报文==(对于应用程序传下来的报文不合并也不拆分,只是添加 UDP 首部),==支持一对一、一对多、多对一和多对多的交互通信==。传输控制协议 TCP(Transmission Control Protocol)是=...

2020-04-28 18:30:41 1386

原创 HTTP和HTTPS、GET和POST

相关概念URIURI 包含 URL 和 URN。image.png==请求和响应报文==请求报文image.png响应报文image.pngHTTP方法GET:获取资源HEAD:获取报文首部POST:传输实体主体PUT:上传文件(自身不带验证机制,不安全)PATCH:对资源进行部分修改(允许部分修改,PUT只能完全替换)DELET...

2020-04-28 18:19:14 612

原创 Java中websocket使用

websocket 和socket区别1. websocket是应用层的协议,而socket是传输控制层的协议. websocket 和http区别相同点:都是应用层的协议都是基于tcp,并且都是可靠的协议不同点:1 .websocket是持久连接的协议,而http是非持久连接的协议.2. websocket是双向通信协议,模拟socket协议,可以双向发送消息,而htt...

2020-04-28 18:07:22 384

原创 计算机概述

概述基本特征并发/并行并发是指宏观上在一段时间内能同时运行多个程序,操作系统通过引入进程和线程,使得程序能够并发运行。并行则指同一时刻能运行多个指令,需要硬件支持,如多流水线、多核处理器或者分布式计算系统。共享共享是指系统中的资源可以被多个并发进程共同使用。有两种共享方式:互斥共享和同时共享。互斥共享的资源称为临界资源,例如打印机等,在同一时刻只允许一个进程访问,需要用...

2020-04-26 20:18:14 184

原创 常见查找和排序算法

查找算法顺序查找查找成功最多要n 次,平均(n+1)/2次,时间复杂度为O(n)。优点:既适用顺序表也适用单链表,同时对表中元素顺序无要求,给插入带来方便,只需插入表尾即可。缺点:速度较慢。public int searchByOrder(int flagNum, int[] array, int n){ if(array!=null && n>0){ ...

2020-04-26 19:56:11 369

原创 Android进阶面试题

1. Android系统启动流程是什么?==Android系统核心流程==:==启动电源以及系统启动==:当电源按下时引导芯片从预定义的地方(固化在ROM)开始执行,加载引导程序BootLoader到RAM,然后执行。==引导程序BootLoader==:BootLoader是在Android系统开始运行前的一个小程序,主要用于把系统OS拉起来并运行。==Linux内核启动==:当内核启...

2020-04-26 19:50:10 688

原创 Window和WMS

1.Window与WindowManagerWindow是一个抽象类,==它的具体实现是PhoneWindow==,==Window创建时通过WindowManager完成==。WindowManager与WindowManagerService交互是一个IPC过程。Flags--Window属性FLAG_NOT_FOCUSABLE--表示当前Window不需要焦点,也不需要接收事件,事...

2020-04-26 19:37:13 206

原创 AMS和Activity启动过程

AMSAMS的功能==统一调试应用程序的Activity==:应用程序要运行Activity,首先会报告给AmS,然后由AmS决定该Activity是否启动。AMS必须知道各个应用程序运行的Activity。==内存管理==: Activity退出后,其所在的进程并不会被立即杀死,从而在下次启动的时候,提高Activity的启动速度。这些Activity只有在内存吃紧的时候,才会被自动杀死...

2020-04-16 16:02:08 386 1

原创 内存监控LeakCanary1.6.1使用和原理分析

使用LeakCanary 的集成过程很简单,首先在 build.gradle 文件中添加依赖:dependencies { debugImplementation 'com.squareup.leakcanary:leakcanary-android:1.6.1' releaseImplementation 'com.squareup.leakcanary:leakcanary-and...

2020-04-16 15:55:41 335

原创 跨进程通信和Binder机制

Android中进程和线程的关系和区别线程是CPU调度的最小单元,同时线程是一种有限的系统资源;而进程一般指一个执行单元,在PC和移动设备上指一个程序或者一个应用。进程有自己独立的地址空间,而进程中的线程共享此地址空间,都可以并发执行。一般来说,一个App程序至少有一个进程,一个进程至少有一个线程(包含与被包含的关系),通俗来讲就是,在App这个工厂里面有一个进程,线程就是里面的生产线...

2020-04-16 15:47:46 493

原创 Android的Handler消息机制

Handler消息机制Android消息循环流程图image.png每个 Handler 都会跟一个线程绑定,并与该线程的 MessageQueue 关联在一起,从而实现消息的管理以及线程间通信。主要涉及的角色如下所示:message:消息。MessageQueue:消息队列,负责消息的存储与管理,负责管理由 Handler 发送过来的Message。读取会自动删除消息,...

2020-04-16 15:40:12 212

原创 Android线程相关

==进程和线程==进程:进程是资源分配的基本单位。进程控制块 (Process Control Block, PCB) 描述进程的基本信息和运行状态,所谓的创建进程和撤销进程,都是指对 PCB 的操作。线程:线程是独立调度的基本单位。一个进程中可以有多个线程,它们共享进程资源。区别拥有资源:进程是资源分配的基本单位,但是线程不拥有资源,线程可以访问隶属进程的资源。调度:线程是独立调...

2020-04-16 15:29:10 127

原创 Android中Bitmap的使用

Bitmap使用需要注意哪些问题 ?要选择合适的图片规格(bitmap类型):通常我们优化Bitmap时,当需要做性能优化或者防止OOM,==我们通常会使用RGB_565==,因为ALPHA_8只有透明度,显示一般图片没有意义,Bitmap.Config.ARGB_4444显示图片不清楚,Bitmap.Config.ARGB_8888占用内存最多。:ALPHA_8 每个像素占用1by...

2020-04-16 15:28:19 334

原创 ViewStub 使用和懒加载原理

概述有时需要某个布局在一开始不显示,在某个条件下才显示,可以通过visable属性来控制,但这样效率非常低,因为虽然布局隐藏来,但还在布局中,仍会解析这些布局。可以使用ViewStub控件来解决这个场景并提高效率。“懒加载”就是为了让程序尽可能快地启动而提出的一个优化策略,即让那些对用户不重要或者不需要立即显示的布局控件做延迟加载,只在需要显示的时候才进行加载,这样就可以让程序在启动显示的过...

2020-04-16 15:25:39 282

原创 RecycleView缓存

RecycleView内存泄漏RecycleView缓存、回收机制RecyclerView是以ViewHolder作为单位进行回收。Recycler是RecyclerView回收机制的实现类,他实现了四级缓存:mAttachedScrap: 缓存在屏幕上的ViewHolder。mCachedViews: 缓存屏幕外的ViewHolder,默认为2个。ListView对于屏幕外的缓存都会调...

2020-04-16 15:23:27 253

原创 java中的队列

队列的定义和数据类型定义:队列,也叫先进先出表,是一种运算受限的线性表,其限制是仅允许在表的一端进行插入,而在表的另一端进行删除。插入的一端称为队尾,进行删除的一端称为队首。队列的基本操作:加入 offer()、获取队首元素peek()、删除后返回队首元素poll()java中队列相关的类和结构image.png没有实现阻塞接口的PriorityQueue 类实...

2020-04-16 14:08:13 114

原创 11.并发(Thinking in java学习11)

多线程编程从根本上来看,所谓的多线程编程,不过是JVM或者说当前的计算机体系结构无法处理好多线程下资源竞争的情况而人为加上的一些处理方法。多线程编程是为了更好的使用CPU的性能,人为设计出来的补偿机制。并发三个特性:原子性:原子性表示一步操作执行过程中不允许其他操作的出现,直到该操作的完成。可见性:可见性是指当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看...

2020-04-16 14:06:46 165

原创 10.注解(Thinking in java学习十)

基本概念定义:注解(也称为元数据)为我们在代码中添加信息提供了一种形式化的方法,使我们可以在稍后某个时刻非常方便地使用这些数据。注解在一定程度上是在把元数据和元代码文件结合在一起。通过使用注解,我们可以把这些元数据保存在Java源代码中,并利用annotation API为自己的注解构造处理工具。Java内置了三种定义在java.lang中的注解@Override,覆盖超类@Dep...

2020-04-16 14:03:50 176

原创 9.泛型(Thinking in java 学习九)

多态算是一种泛化机制,但是拘泥于单继承体系,也会使程序受限太多。JavaSE5中提出了泛型的概念。泛型概念:泛型实现了参数化类型的概念,使代码可以应用于多种类型。简单泛型(泛型类)为了创造容器类,是促成了泛型出现的主要原因。泛型的主要目的之一是用来指定容器要持有什么类型的对象,而且由编译器来保证类的正确性。public class Holder<T>{ private ...

2020-04-16 14:00:50 147

原创 8.类型信息和反射(Thinking in java学习八)

运行时类型信息运行时类信息使得你可以在程序运行时发现和使用类信息。在运行时识别对象和类的信息的方式:传统的RTTI:它假定我们在编译时已经知道了所有的类型;反射机制,它允许我们在运行时发现和使用类的信息。为什么需要RTTI使用RTTI,可以查询某个对象引用所指向的对象的确切类型,然后选择或者剔除特例。Class对象Class对象就是用来创建类的所有常规对象的。Java使用C...

2020-04-16 14:00:16 140

原创 7.异常处理(Thinking in java学习七)

编译器并不能找出所有的错误,那么剩下的问题必须在运行期解决了。Java使用异常来提供一致的错误报告模型,使得构件能够与客户端代码可靠地沟通问题。概念使用异常的好处:往往能够降低处理代码的复杂度;异常机制使代码的阅读、编写和调试工作更加井井有条。基本异常异常情形是指阻止当前方法或作用域继续执行的问题。普通问题是指在当前环境下能得到足够的信息,总能处理这个错误。异常参数...

2020-04-16 13:59:39 163

原创 6.内部类(Thinking in java学习六)

内部类是一种非常有用的特性,它允许你把一些逻辑相关的类组织在一起,并控制位于内部的类的可视性。内部类定义:将一个类的定义放在另一个类的定义内部。创建内部类想从外部类的非静态方法之外的任意位置创建某个内部类对象,则具体指明这个对象的类型:OuterClass.InnerClass链接到外部类当生成内部类的对象时,此对象与制造它的外围对象之间就有了一种联系,所以它能访问其外围对象的所有成员,...

2020-04-16 13:55:37 121

原创 5.接口(Thinking in java学习五)

接口和内部类为我们提供了一种将接口与实现分离的更加结构化的方法。抽象类和抽象方法(abstract)抽象基类,简称抽象类:通用接口建立起一种基本形式,以此表示所有导出类的共同部分。抽象方法:仅有声明而没有方法体。继承一个抽象类,就必须为基类中的所有抽象方法提供方法定义。注意:如果一个类包含一个或者多个抽象方法,该类必须被限定为抽象的。抽象类是很有用的重构工具,它们使得我们可以很...

2020-04-16 13:54:58 132

原创 4.多态(Thinking in java学习四)

多态通过分离做什么和怎么做,从另一角度将接口和实现分离开来。多态不但能够改善代码的组织结构和可读性,还能够创建可扩展的程序。==多态存在的三个必要条件==:要有继承要有重写父类引用指向子类对象转机方法调用绑定绑定:将一个方法调用同(与)一个方法主体关联起来被称作绑定。前期绑定:若在程序执行前绑定,叫做前期绑定。后期绑定(动态绑定,运行时绑定):在运行时根据对象的类型进行绑...

2020-04-16 13:53:56 305

原创 3.复用类(Thinking in java学习三)

组合语法将对象引用置于新类中即可。编译器并不是简单地为每一个引用都创建默认对象,因为若真要那样做的话,就会在许多情况下增加不必要的负担。初始化引用,可以在以下位置:在定义对象的地方。在类的构造器中。就在正要使用这些对象之前,这种方式成为惰性初始化。使用实例初始化。继承语法继承是所有OOP语言和Java语言不可或缺的组成部分。继承的一般访问权限规则:将所有的数据成员都指定为p...

2020-04-16 13:53:07 103

原创 2.访问控制权限(Thinnking in java学习二)

包:库单元包内包含有一组类,它们在单一的名字空间之下被组织在了一起。注意:当编写一个Java源代码时,此文件通常被称为编译单元。每个编译单元都必须有个后缀名.java,而在编译单元内有个一public类,该类的名称必须与文件的名称相同。每个编译单元必须只有一个public类,否则编译器就不会接受。Java访问权限修饰词public、protected、private。若不提供任何修饰词,则...

2020-04-16 13:52:30 139

原创 1.初始化与清理(Thinking in java学习一)

1. 用构造器来确保初始化创建对象时,如果该类具有可用的构造器,java就会在用户有能力操作对象之前自动调用相应的构造器,从而保证了初始化的进行。Java中“初始化”与“创建”捆绑在一起的两者不能分离。问题1:构造器是一类特殊的方法,它没有返回值。与返回值为空(void)的区别?对于空值返回,尽管方法本身没有返回什么,但是仍然可以选择让它返回别的东西,但是构造器则不会返回任何东西,你别无...

2020-04-16 13:51:38 146

空空如也

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

TA关注的人

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