自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(63)
  • 资源 (3)
  • 收藏
  • 关注

原创 Android坐标系及View的位置信息

​View中有很多方法,getTop,getLeft,getX,getScrollX,getY,getScaleX,getTranslationX等等。它们获取的到底是什么意思呢?Android坐标系在Android坐标中,左上角原点,水平向右为X轴,竖直向下为Y轴,垂直屏幕向上是Z轴。不管横屏还是竖屏均是此逻辑。View的位置信息ViewA移动到ViewA’后的位置关系,如下图:View中的位置信息有两点很重要:位置信息是相对于父布局获取的位置信息均是像素View的基本信息:

2021-03-12 09:41:40 440

原创 Java中的引用类型

强引用弱引用软引用虚引用

2021-03-07 18:02:23 372 1

原创 创建性设计模式

创建性设计模式抽象了对象的实例化过程。它们帮助系统与系统使用的对象的创建解耦。创建性模式可以通过继承来改变实例化的类(工厂方法),也可以通过委托来实例化对象(抽象工厂,工厂方法,Builder)。

2021-02-21 22:18:30 288

原创 工厂相关的模式-简单工厂,工厂方法,抽象工厂

工厂模式是在创建对象与使用之间添加中间层,从而解耦对象的使用与对象的创建,工厂模式有三种:简单工厂 : 通过类型创建不同的类的实现,类型可以是枚举,也可以是字符串,或者通过反射来实现。工厂方法 :每种产品类均对应一个工厂类,从而只依赖特定的工厂类。抽象工厂:与工厂方法相似,但是抽象工厂基本使用在一组产品类的问题上。...

2021-02-21 22:07:27 317 5

原创 Builder模式

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以构建不同的表示。也就是说构建对象的过程相同,但是对象的行为却不同。

2021-02-21 16:35:34 172

原创 原型模式

原型模式顾名思义就是以一个对象为基础复制出一个新的对象。。

2021-02-21 15:00:11 134

原创 可重用性,可维护性,可读性,可测试性,可用性,健壮性

可重用性,可维护性,可读性,可测试性,可用性,健壮性

2021-02-19 21:35:25 4501

原创 单例设计模式

什么是单例模式单例模式:可以说是23种设计模式种最简单的模式了,是说类只有一个供全局访问的单个实例,类不能实例化。这里有两个点:类只有一个供全局访问的实例类不能实例化为什么使用单例模式我们期望只提供类的实例供外部系统使用,节约内存。注意事项:单例类应该只提供读功能,不提供写功能,也就是说不提供相关的方法改变类实例的状态。比如:public class Singleton { private static Singleton instance = new Singlet

2021-02-18 09:31:24 155 3

原创 Activity看这篇就够了

文章目录什么是Activity?怎么使用Activity?Activity的生命周期任务栈与Activity的启动方式Activity与ContextActivity与WindowActivity与View什么是Activity?怎么使用Activity?Activity的生命周期任务栈与Activity的启动方式Activity与ContextActivity与WindowActivity与View问题?进程与任务栈的关系任务栈与Activity的关系...

2021-01-17 19:19:47 299

原创 RxJava如此简单

什么是RxJavaRxJava是ReactiveX的Java VM实现,用于通过使用可观察的序列来组成异步和基于事件的库。它扩展了观察者模式以支持数据和/或事件序列,并添加了运算符,便于数据处理。为什么使用RxJava使用Rxjava的原因主要是便捷的异步数据处理,以及方便的线程切换。如何使用RxJava引入RxJava库implementation "io.reactivex.rxjava3:rxjava:3.0.8"//可选implementation "io.reactivex.r

2020-12-29 21:30:40 195

原创 面向对象的六大原则

面向对象的六大原则单一职责原则开闭原则里氏替换原则依赖倒置原则接口隔离原则迪米特原则单一职责原则对一个类而言,应该仅有一个引起它变化的原因。一个类应该相关性很高的封装。对于单一职责,定义类的职责是最大的问题,如何判定某个职责属于某个类呢?我们可以通过另一个GRASP中的来去间接说明职责分配的问题。那就是GRASP中的信息专家,* 信息专家(Information Expert...

2020-12-09 21:52:49 462

原创 常见的编程范式-面向过程,面向对象,函数式编程,响应式编程

编程范型提供了程序员对程序执行的看法。例如,在面向对象编程中,程序是一系列相互作用的对象。在面向过程编程中,程序是一系列步骤的组合的过程,先执行那个步骤,然后执行那个步骤,最后在执行那个步骤。在面向函数式编程中,一个程序会被看作是一个无状态的函数计算的序列,函数可以作为参数,返回值。在响应式编程中,程序被看作是数据流和以及其传播的过程。面向过程编程使用过C语言,我们就能深刻体会面向过程编程。我们会把一个任务分成若干个步骤,先执行哪一步,然后执行哪一步,最后执行哪一步,就相当于生产线,吭哧吭哧执行完,任务

2020-12-07 21:44:58 1225

原创 面向对象的基本原则-抽象,封装,继承,分解

封装继承多态组合

2020-12-07 18:14:31 795

原创 分辨率,屏幕尺寸,屏幕密度,dp,px,sp

我们在做UI时候经常遇到这几个概念,但是就是不知道他们之间的关系,这篇文章将会解惑。像素:显示图像的基本单元,单位px分辨率:是纵横向上的像素点数,单位是px,比如1920X1080说的是纵向有1920个像素点,横向有1080个像素点。屏幕尺寸:是手机屏幕对角线的长度,单位为英寸。屏幕像素密度:每单位的像素的点数,简称PPI(Pixels Per Inch),单位dpi(Dots Per Inch)。上述的关系为屏幕的像素密度=√(分辨率高² + 分辨率宽²)÷ 屏幕尺寸。例如:...

2020-11-24 22:42:57 3167

原创 使用MediaScannerConnection主动更新MediaStore

现象:在适配Android11迁移文件夹时,遇到一个问题。在Android11以下版本迁移多媒体文件成功后,我们使用SAF选择文件时,还是可以看到多媒体文件。但是多媒体文件已经不存在了。原因:虽然我们的多媒体文件已经不存在了,但是MediaStore中的数据库还存在原来多媒体文件的数据。解决方案:那我们刷新一下MediaStore中的数据库就可以了。可以通过MediaScannerConnection.scanFile静态方法来刷新。我这里封装了一下,传入目录或者文件都可行。我这里没有传如mimeTyp

2020-11-05 18:42:27 2677

原创 一篇搞懂OOA/OOD/OOP的区别

此篇文章介绍OOA/OOD/OOP的区别。

2020-11-01 15:59:52 15501

原创 刀哥咱俩探讨一下重构的手法

周一早上,竖三早早的来到了空无一人的办公区,坐在工位上百无聊赖。心里还在想着周末的王者荣耀十五连胜,暗暗窃喜,我TMD太厉害,尔等且是凯爹的对手,加油干保持二十连胜。咦对了,刀哥今天要给我说说如何消除代码坏味道,我赶紧学习,等他来了跟他交流交流。说干就干,打开电脑就看了起来。不知不觉一个小时过去了。竖三伸伸懒腰,感觉收获颇丰。正好上周六才上线新版本,今天无事,找刀哥聊聊去。“刀哥,上周六你说今天给我讲讲消除代码坏味道的方法。今天什么时候有时间咱俩探讨探讨。” 竖三说“就现在吧,版本刚发,闲来无事。”

2020-10-31 10:53:07 323

原创 来来竖三我跟你说说代码的坏味道

周六的清晨,光线照进了阴暗的办公室里,原本黑暗的室内瞬间变得透亮,定睛一看还能瞧见灰尘在光线中起舞。刀哥伸着懒腰,打着哈欠,项目终于在通宵中告一段落。刀哥不经意间瞥见了竖三,突然想起了上次跟他说的重构只说了一半,由于赶着项目上线,一直没时间跟他说另一半,正好今天项目完结了,我跟他讲讲。刀哥站起身来,有气无力的走到竖三身边说:“三,上次欠你的重构的债还没还呢,今天我跟你说说代码的坏味道吧?”竖三转头看着刀哥,两只眼睛似睁未睁,无力地说:“刀哥你饶了我吧,一宿没睡,我现在眼睛都睁不开了,我要回家躺尸了,改天

2020-10-31 10:44:09 185

原创 从面向对象到架构设计博客更新计划

写作计划面向对象是我们使用面向对象语言的基础,它是一种思想,为了能写出更好的面向对象的必备技能。我会简要的说明面向对象常用内容。这个模块大概输出4~5篇左右的内容。OOA,OOD,OOP的概念面向对象设计的常见特征面向对象设计的GRASP原则面向对象设计的六大原则接下来的我会输出常用的设计模式。此模块输出25篇左右,23篇设计模式,以及常用的MVP,MVC和MVVM各一篇。通过这块的学习,一方面我们可以使用前辈的经验,快速解决问题,另一方面学习设计模式的理念我们能更加熟悉面向对象设计与编码。

2020-10-27 18:14:18 115

原创 Android11适配-包可见性

Android11的包可见性我们的应用常常会碰到与其他应用交互,比如登录功能,我们可能希望使用微信登录或者QQ登录,再比如分享,我们先判断是否安装了微信,然后决定是否展示微信的分享图标等等。这里我们有一个需求就是获取相关的软件包是否已经安装。但是在Android11中,除了默认的一些应用外,我们不能直接获取到软件包是否已经安装了,换句话说我们安装了一个应用,但是我们调用 getInstalledApplications() 或 getInstalledPackages()的可能没有返回此包名。这就是An

2020-10-19 20:19:05 4030

原创 Android11(30)/Android10(29)分区存储-存储访问框架(SAF)

概述存储访问框架(SAF)是在Android 4.4(API 级别 19)引入的。借助 SAF,用户可轻松打开文档、图像及其他文件。存储访问框架包含三部分:文档提供程序 — 文档提供程序以 DocumentsProvider 类的子类形式实现。Android 平台包含有内置文档提供程序,如 Downloads、Images 和 Videos。客户端应用 — 应用可以通过发送 ACTION_OPEN_DOCUMENT 或 ACTION_CREATE_DOCUMENT 的Intent来启动选择器,并.

2020-09-20 21:17:42 4622

原创 Android11(30)/Android10(29)分区存储-适配方案

适配Android10分区存储Android10是分区存储的过度版本,不建议开启分区存储。我们可以android:requestLegacyExternalStorage="true"来关闭Andorid10的分区存储。<application android:requestLegacyExternalStorage="true"></application>Android11适配Android11分区存储强制开启,分区存储开启后,存在两个问题 一个是比如文件管.

2020-09-20 21:13:53 5896

原创 Andorid11(30)/Android10(29)分区存储-应用间共享文件

在Android11/Andorid10分区存储中,两个应用之间如何共享文件呢?比如说我的应用生成了一个jpeg图片,想分享到微信,该怎么搞?有三种方案:生成到公共目录下,通过File接口分享(微信支持)生成到公共目录下,通过MediaStore接口进行分享(微信不支持)生成到私有目录下,通过FileProvider进行分享(微信支持)本篇代码比较多,比起废话,Show code更靠谱。生成到公共目录下,File接口分享对于Android10的分区存储不支持此方案,而Android11的.

2020-09-20 21:01:13 3833 1

原创 Android11(30)/Android10(29)分区存储-相关接口

本文仅仅是接口说明,对于具体的使用方式,后续会说明。为了让用户更好地管理文件并减少混乱,Android 10(API 级别 29)引入了分区存储。分区存储是应用只能看到本应用特定的目录下的文件(通过 Context.getExternalFilesDir() 访问),公共目录下的媒体文件(通过MediaStore访问),以及存储访问框架返回的文件,不能像以前为所欲为了。Android10(API级别29)没有强制要求使用分区存储,但是在Android11(API级别30)强制使用分区存储。下表是分区.

2020-09-20 20:53:26 2710 2

原创 刀哥你咋地又回来了?

我在A司干的不爽,回到了原来的公司,上班第一天与原来公司的同事殷勤的问候了一番。坐下来准备工作时,这时三愣子慢悠悠的走过来,走到我的面前,勾着我的肩,头凑到我面前,说:"刀哥,你咋地又回来了?在A司不好吗?"。我摇摇头嘴角上扬,漏出一抹苦笑,说:"哪里好呀?"。"薪资福利不是挺好吗?""A司这方面是不错,有零食,下班有车接,每月还有各种补助,最重要的是工资年终还挺高。“"你SB呀,回来干嘛?"“是有点SB。”“那你到底为啥回来呀?”"要是真说到底为啥离开,你想听的话,我还真可以.

2020-07-19 21:06:12 400

原创 Kotlin快速入门_Kotlin中变量定义

变量定义可以用val和var两种方式来定义。val定义变量//kotlinval str :String = ""//java方式final String str = ""val就是定义一个值不可变的变量,也就是java中的final变量。var定义变量//kotlinvar str : String =""//java 方式String str = ""var定义一个...

2019-11-17 15:45:18 537

原创 Android Studio中引入Kotlin

安装Kotlin插件从Android studio3.0开始我们已经全面支持Kotlin。我们不需要添加Kotlin插件。而在Android2.X,我们还是需要添加Kotlin插件。Setting -> Plugins中下载kotlin插件。项目中配置Kotlin为了能够使用Kotlin,我们需要在项目中配置Kotlin。在Tools -> Kotlin -> Config...

2019-11-17 15:28:52 3108

原创 Kotlin概述

Google官宣钦定Kotlin作为Android首选开发语言,我们也渐渐接触到Kotlin语言,但是为什么使用Kotlin呢?使用Kotlin如下的好处:代码简洁。相比Java,完成相同的功能代码更加简洁,不需要书写冗余的代码,比如get,set等等方法。互操作性。与Java可以互操作,Java可以调用Kotlin代码,Kotlin可以调用Java代码,因此项目中引入Kotlin成本低廉...

2019-08-13 18:46:36 236

原创 OKHttp3源码分析-ConnectionInterceptor

主要的类包含ConnectInterceptor,StreamAllocation,RealConnection,ConnectionPool。我们先分析ConnectionPool,然后分析ConnectionInterceptor。连接池ConnectionPool作用主要是复用Http连接,避免网络连接的时延,以及避免TCP调谐带来的带宽过小的问题。ConnectionPool主要有...

2019-03-24 11:51:17 361

原创 OkHttp3源码分析-缓存与CacheInterceptor

基本结构CacheInterceptor依赖两个关键类,一个是CacheStrategy,一个是InternalCache。CacheStrategy采用的是简单工厂模式(其实只是抽象工厂的特例),此类用于判定使用缓存,网络还是二者都使用。InternalCache基本不会自己去设置,会使用Cache中的InternalCache的结构,而Cache实际上是通过DiskLruCache实现...

2019-03-12 11:42:09 508

原创 OkHttp3源码分析-BridgeInterceptor

BridgeInterceptorBridgeInterceptor主要用于网络请求的构建,和响应的解析。public final class BridgeInterceptor implements Interceptor { @Override public Response intercept(Chain chain) throws IOException { ...

2019-03-12 11:27:58 200

原创 OkHttp3源码分析-RetryAndFollowUpInterceptor

RetryAndFollowUpInterceptorRetryAndFollowUpInterceptor有两个功能,一个是重试,一个是重定向。如果Call被取消,RetryAndFollowUpInterceptor将抛出异常。我们来一起分析一下。public final class RetryAndFollowUpInterceptor implements Interceptor {...

2019-03-12 11:26:18 166

原创 OKHttp3源码分析-流程与结构

文章目录基本用法获取OkHttpClient对象创建Request对象获取Call对象调用`Call`的方法execute方法enqueue方法拦截器基本用法public static final MediaType JSON = MediaType.parse(&amp;quot;application/json; charset=utf-8&amp;quot;);//1. 获取OkHttpClient对象OkH...

2019-03-09 11:14:08 258

原创 Retrofit源码解析

文章目录概述Java接口定义构建Retrofit对象生成Java接口对象调用对象的方法获取`Call`PlatformRetrofit的loadServiceMethod方法ServiceMethod获取CallAdapter对象Converter对象循环解析方法注解解析方法参数注解创建ServiceMethod对象创建OKHttpCall对象通过Call进行网络请求结构设计Retrofit和Re...

2018-12-18 17:07:37 254

原创 UI优化

概述总结来源与Google发布的性能优化的视频 Android Performance Patterns 和 Android Performance Optimizing Apps for Speed and Usability 。对于用户感到卡顿,不流畅的原因有很多,比如Layout层级结构过深,动画过多,界面刷新,等等导致了CPU或者GPU的负担过重,16ms内无法完成一帧的绘制,导致了掉帧...

2018-12-16 17:56:45 1854

原创 View的Touch事件分析

文章目录DecorViewTouch事件处理Activity中的Touch事件处理函数PhoneWindow对象superDispatchTouchEventView的Touch事件处理特性View控件的Touch事件处理View的onTouchEventViewGroup控件的Touch事件处理分析来自Android8.1.0源码DecorViewTouch事件处理我们现在先关注View相...

2018-12-16 16:01:36 298

原创 组件对外接口设计-易用性

示例OKHttp网络请求:FormBody formBody = new FormBody.Builder() .add("pay_fee", String.valueOf(product.getProductPrice())) .add("product_name", String.valueOf(product.getProductName())) ...

2018-12-05 15:30:44 1614

原创 Activity与Context

文章目录Application与Context关联获取Application对象Activity与Context关联的过程Activity中的ContextActivity与Context的关系图Context是通过装饰者模式来组织的。ContextImp实现了通用的Context接口,也是为Activity和Application提供基础的Context接口。对于装饰者类均有一个mBase...

2018-12-03 21:39:10 1322

原创 Android中的智能指针

文章目录对象的维护Android中的智能指针轻量级指针 - LightRefBase强引用,弱引用原理RefBase强引用原理弱引用原理参考资料对象的维护在编程中,维护对象的生命周期的方式有两种方式:可达性算法引用计数算法Java通过可达性管理对象的生命周期GC可达性实践-内存泄露分析。而C++中由于没有GC的机制,通常使用的是引用计数算法。简单的引用计数通常是给对象添加一个引用计...

2018-11-02 11:25:08 1783 1

原创 Handler中的内存泄露

预备文章:Handler与LooperGC可达性实践-内存泄露分析场景1看码识错误1:class Scene1Activity : AppCompatActivity() { private val mHandler = Handler() override fun onCreate(savedInstanceState: Bundle?) { supe...

2018-10-31 17:07:55 1342 2

EventLogTags

Activity 的Event log 标签 # An activity is being finished: 30001 am_finish_activity (User|1|5),(Token|1|5),(Task ID|1|5),(Component Name|3),(Reason|3) # A task is being brought to the front of the screen: 30002 am_task_to_front (User|1|5),(Task|1|5) # An existing activity is being given a new intent: 30003 am_new_intent (User|1|5),(Token|1|5),(Task ID|1|5),(Component Name|3),(Action|3),(MIME Type|3),(URI|3),(Flags|1|5) # A new task is being created: 30004 am_create_task (User|1|5),(Task ID|1|5) # A new activity is being created in an existing task: 30005 am_create_activity (User|1|5),(Token|1|5),(Task ID|1|5),(Component Name|3),(Action|3),(MIME Type|3),(URI|3),(Flags|1|5) # An activity has been resumed into the foreground but was not already running: 30006 am_restart_activity (User|1|5),(Token|1|5),(Task ID|1|5),(Component Name|3) # An activity has been resumed and is now in the foreground: 30007 am_resume_activity (User|1|5),(Token|1|5),(Task ID|1|5),(Component Name|3) # Application Not Responding 30008 am_anr (User|1|5),(pid|1|5),(Package Name|3),(Flags|1|5),(reason|3) # Activity launch time

2017-09-06

设计模式-可复用面向对象软件基础思维导图总结(2)

设计模式-可复用面向对象软件基础思维导图总结(2)

2017-06-20

设计模式-可复用面向对象软件基础思维导图总结

设计模式-可复用面向对象软件基础思维导图总结

2017-06-03

空空如也

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

TA关注的人

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