自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(79)
  • 收藏
  • 关注

原创 Kotlin Flow无缝衔接Retrofit——FlowCallAdapter

* 本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布:https://mp.weixin.qq.com/s/BCmvMHfX8zGnUL5Om_Ez9w

2020-04-24 10:26:00 9253 1

原创 SmartShow 2.x 版重磅来袭

* 本篇文章已授权微信公众号guolin_blog(郭霖)独家发布:https://mp.weixin.qq.com/s/7qQdPLLfhZA_i7HjucfgWA各位老铁,SmartShow更新至2.7.6了,感谢大家一直以来的支持。2.x版跟1.x版相比,有重大的更新,也有值得分享的东西。SmartToastBadTokenException解决方案Android 7...

2018-11-11 16:30:01 4116 7

原创 Smart Toast and Snackbar:简化调用,并提高性能和用户体验!

  * 本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布:https://mp.weixin.qq.com/s/l62PtbmrIOkVKfJ2r0JwEwApp的界面消息提示中,Toast和Snackbar是咱们经常打交道的哥俩,在使用的过程中,如果不加以封装和处理,调用的简易性以及性能和用户体验上就会存在诸多问题。下面给大家介绍一个我封装的库,SmartShow的...

2017-11-18 14:10:57 14025

原创 设计模式详解(十二):单例模式——Singleton

单例模式 (Singleton Pattern) 是一种常见的设计模式,用于确保一个类在整个应用程序运行期间只有一个实例,并提供全局访问点。本文将详细介绍单例模式的定义、实现方式、优缺点,以及 Android 源码中的使用实例,配以图解与注释。唯一性:确保类只有一个实例。全局访问:提供对该实例的全局访问。

2024-12-23 17:18:33 1405

原创 设计模式详解(十一):模板方法——Template Method

Template Method 模式是一种将算法的步骤结构固定下来的设计模式,通过一个模板方法(Template Method)定义算法的执行顺序,同时将部分步骤的实现延迟到子类中去完成。通俗来说,就是定义一个通用的流程框架,并允许子类根据需要填充其中的具体步骤。

2024-12-17 15:34:12 1124

原创 设计模式详解(十):策略模式——Strategy

Strategy模式是一种行为型设计模式,它定义了一系列算法,将每种算法封装到独立的类中,使它们可以互换。使用该模式,可以在不修改客户端代码的情况下动态地改变算法的行为。Strategy模式是解决算法或行为动态切换的有效方法。它通过将算法抽象化,使得代码更加灵活、易于扩展,同时也减少了代码重复。如果你在开发过程中遇到了需要频繁修改或扩展算法的需求,不妨考虑使用Strategy模式。

2024-12-11 10:37:11 975

原创 设计模式详解(九):状态模式——State

状态模式主要解决的是对象在不同状态下表现出不同行为的问题。状态切换:将状态转移逻辑放入状态对象中,而不是集中在一个类里。行为封装:将与特定状态相关的行为封装到独立的状态类中。对象的行为依赖于其状态。状态的数量相对有限,且可能需要频繁切换。通过状态模式,上下文类可以专注于请求的分发,而无需关心具体状态的实现。graph TD状态模式在设计复杂系统时,能有效地组织状态行为,增强代码的可维护性。希望这篇文章对你理解状态模式有所帮助!

2024-12-06 14:07:17 1369

原创 设计模式详解(八):命令模式——Command

Command(命令)模式是一种行为型设计模式,它将请求封装为对象,从而使你可以用不同的请求、队列或日志参数化对象,并支持可撤销操作。这种模式在解耦调用者与接收者之间的交互时非常有用。Command 模式通过将请求封装为对象,实现了请求的解耦和操作的灵活性。在 Android 开发中,Command 模式在任务执行、事件处理以及组件通信中都扮演了重要角色,是理解和设计复杂系统的重要工具。

2024-06-04 17:37:55 753

原创 设计模式详解(七):外观模式——Facade

外观模式的英文名是Facade,意思是the front of a building,即建筑物的正面(门面),我个人更喜欢翻译成门面模式。门面模式是一种结构型设计模式,所谓结构型是指在代码结构设计方面的设计模式。门面模式是一个类或一个模块统一的功能入口,屏蔽掉系统内部的实现及运作方式,客户端通过门面与系统交互,大大降低使用的复杂度,减少与系统的耦合。

2024-06-03 15:45:54 1511

原创 设计模式详解(六):装饰器模式——Decorator

装饰器模式能够在不改变对象功能接口的情况下,增强新功能。装饰器和原有对象实现了共同的功能接口,在调用功能方法时,将请求委托给被包装者的同名方法,并可在委托执行的前后做一些工作,以添加新的功能特性。装饰器间可以互相嵌套,对外界来说,调用得始终是“一个”对象,并不清楚内部包裹了多少层,以及包裹了怎样的对象。该类实现了与SimplePrinter同样的功能接口,即不改变被包裹对象的接口,且内部持有一个成员变量,存放被包裹的对象,类型需声明为接口类型。例如,我们的基础对象是一个打印器,在控制台打印输入的字符串。

2024-05-30 22:00:59 959 1

原创 设计模式详解(五):适配器模式——Adapter

RecyclerView作为UI组件,只负责展示数据,至于数据的来源,获取方式(如数据库、网络、内存),完全不关心,也无法预知。所以定义了获取数据的Adapter接口,想要为Recycler提供数据,需定义一个类,实现Adapter接口,提供展示的数据。苹果电脑是没有USB插孔的,如果想要连接USB插头的设备,必须使用适配器。对于苹果电脑来说,与满足自身接口协议的适配器交互,不知道也不关心在适配器的另一端的设备的交互协议是怎样的。对于USB设备来说,只与适配器的USB插口交互,同样也不关心另一端的情况。

2024-05-29 20:30:39 736

原创 设计模式详解(四):原型模式——Prototype

Prototype(原型)模式是一种创建型设计模式,通过复制现有对象来创建新对象,而不是通过实例化类来创建对象。这种模式在需要生成大量相似对象时非常有用。Prototype 模式通过克隆现有对象来创建新对象,有助于提高对象创建的性能和灵活性。在 Android 开发中,Prototype 模式被广泛应用于对象的复制与复用,是设计高效代码的重要工具之一。

2024-04-28 14:22:48 278

原创 设计模式详解(三):创建者模式——Builder

Builder(建造者)模式是一种创建型设计模式,旨在将复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。它特别适用于创建包含多个组成部分的对象,允许逐步构建对象的过程。Builder 模式通过分离复杂对象的构建过程和表示,提供了构建复杂对象的灵活性和可读性。在 Android 开发中,它被广泛应用于各种场景,尤其是创建包含多个可选参数的对象。理解和应用 Builder 模式是编写高质量代码的重要一环。

2023-11-30 18:09:58 1140

原创 设计模式详解(二):抽象工厂——Abstract Factory

在java中,定义了一组与数据库交互的接口,即可JDBC,由于不同数据库厂商的内部原理及运转必然不同,java无从得知,只能定义抽象接口让不同数据库厂商去实现。抽象工厂设计模式是将一组互有联系,成套提供对象的工厂方法从依赖方抽离出来,放到一个单独的类中,这个类充当一个总管的角色,管理这些工厂方法。中,我们知道,工厂方法是通过一个方法扮演对象工厂的角色,为依赖方提供对象,避免直接调用所依赖类的构造器,从而实现解耦的目的。不同厂商实现的Connection不同,Connection扮演抽象工厂的角色。

2023-11-27 17:08:24 299

原创 设计模式详解(一):工厂方法——Factory Method

在面向对象的编程语言里,我们通过对象间的相互协作,共同完成复杂的业务逻辑,因为对象之间存在着依赖关系。通常对象被称之产品,而生产产品的工具称之为工厂,由于在这种设计模式中,是一个方法承担工厂的作用,所以称之为工厂方法。而是在A的父类中定义一个返回B类型对象的方法,通常该方法的返回值是接口类型或者BaseClass类型,允许A的子类覆盖该方法,返回不同的对象类型C,但需满足。方法,该方法负责创建一个视图对象,由于基类并不清楚子类会返回一个什么样的视图对象,所以该方法是一个工厂方法,返回值定义为基类。

2023-07-12 17:34:11 763

原创 深入解析 Java 中的 ArrayList

ArrayList是一个功能强大且使用便捷的动态数组实现,适用于大多数数据存储与操作场景。通过了解其内部实现和优化方法,开发者可以更高效地使用ArrayList,并避免常见的性能问题和内存泄漏风险。

2023-06-30 09:51:49 309

原创 LeakCanary 内存泄漏检测工具原理详解

LeakCanary 是一个强大的内存泄漏检测工具,它通过监控弱引用、分析堆内存等手段,为开发者提供了高效、直观的内存泄漏定位方法。在实际项目中,合理使用 LeakCanary 能够显著提升代码质量和应用性能。

2023-05-31 18:50:39 1129

原创 HashMap原理(三):扩容

HashMap是 Java 中最常用的集合之一,其底层实现基于哈希表。为了保证其高效性,HashMap需要在一定条件下进行扩容。

2023-05-30 15:57:03 631

原创 HashMap原理(二):链表+红黑树解决哈希冲突

解决哈希冲突最常见的两种方法:链表法和开放寻址法。

2023-02-28 19:58:10 2046

原创 HashMap原理(一):哈希函数的设计

①哈希函数的作用与本质②哈希表容量为2的整数次幂及初始容量的校正③哈希表容量为2的整数次幂的缺陷及解决方案

2023-02-27 21:18:01 1179

原创 Dagger2系列详解(四):@Module注解

Inject}…}…}}}@Module}}.build();@Component}}}}[

2022-11-28 22:05:16 285

原创 Dagger2系列详解(三):@privider 依赖

Inject}…}…}}}@Module}}.build();@Component}}}}[

2022-11-27 19:42:11 418

原创 Hilt 初探

/ public abstract TestInterface bindTestClass(TestClassTwo testClass //实现不同的 功能);Hilt就是Android团队联系了Dagger2团队,一起开发出来的一个专门面向Android的依赖注入框架。1、在项目结构的 build.gradle里面添加以下代码。2、在App结构的 build.gradle里面添加。//详见上面的 hilt 对应组件。2、提供一个实现接口的对象。1、提供一个待实现的接口。Hilt 做的优化包括。

2022-10-31 20:57:39 209

原创 Binder是什么

1.简介Binder是什么?机制:Binder是一种进程间通信的机制驱动:Binder是一个虚拟物理设备驱动应用层:Binder是一个能发起进程间通信的JAVA类Binder就是Android中的血管,在Android中我们使用Activity,Service等组件都需要和AMS(system_server)进行通信,这种跨进程的通信都是通过Binder完成。Activity,Service等组件和AMS不是同一个进程,其实也是多进程通信。为什么要用多进程?虚拟机给每一个进程分配的内存是有限制的,LMK会

2022-10-31 20:46:16 346

原创 归并排序及其复杂度

如果待排序的序列中存在两个或两个以上具有相同关键词的数据,排序后这些数据的相对次序保持不变,即它们的位置保持不变,通俗地讲,就是两个相同的数的相对顺序不会发生改变,则该算法是稳定的;第一次归并后:{6,202},{100,301},{8,38},{1},比较次数:3;第二次归并后:{6,100,202,301},{1,8,38},比较次数:4;第三次归并后:{1,6,8,38,100,202,301},比较次数:4;如 设有数列{6,202,100,301,38,8,1}总的比较次数为:3+4+4=11;.

2022-08-31 22:18:40 473

原创 插入排序及其复杂度

我们假设第一张卡片已经排序,然后选择一张未排序的卡片。如果未排序的卡大于手上的卡,则将其置于右侧,否则将置于左侧。以同样的方式,其他未排序的卡片也会被取出并放在正确的位置。插入排序使用类似的方法。......

2022-08-31 22:12:44 1464

原创 选择排序及其复杂度

选择排序是通过不断地从元素中选出最小的元素放在它应该所处的位置上。例如第次选出的元素应该位于数组的处,如果不是,则将其与之交换位置,从0开始计数。也就是说,不断地从无序区域选择出最小的元素,放在无序区域的头部,也就是有序区域的末尾,这个元素是当前无序区域的最小元素,同时是有序区域的最大元素,本次选择过后,它成为有序区域的最后一个元素。不断地重复这个过程,直至所有元素都处在正确的位置上。初始状态下,整个数组是无序区域,有序区域为空集。......

2022-05-25 19:18:29 674

原创 冒泡排序及其复杂度

冒泡排序算法通过不断比较和交换(如有必要)数据集相邻的两个元素,直到他们有序为止。就像水底的气泡往水面上浮动一样,每一轮的比较和交换都会从无序区域浮出一个最大数,抵达有序区域的起始位置。

2022-05-08 15:43:37 10693

原创 Dagger2系列详解(二):@Component注解

Component是dagger完成注入流程的组织者和协调者,依赖诉求方通过@Inject表达注入诉求后,Component负责调用"生产车间"生产实例,然后调用成员注入器完成对诉求方的注入。

2020-09-10 16:53:55 1080

原创 Dagger2系列详解(一):@Inject注解

@Inject的字面含义为“注入”,它的作用有两个:①表达依赖注入诉求②提供依赖表达依赖诉求用@Inject修饰了一个类的Field后,即表示向dagger框架表达注入诉求,要求获取一个该Field对应类型的对象。dagger框架将负责创建对象并赋予该Field。public class SuperMarket { @Inject protected Apple mApple; public SuperMarket() { }}上面的代码,SuperMarke

2020-09-07 14:26:50 2395

原创 MVI 架构详解

MVI(Model-View-Intent)是一种在现代前端开发中广泛使用的架构模式。它通过单向数据流、不可变状态和清晰的组件职责分工,为应用提供了强大的扩展性和可维护性。

2020-09-07 13:18:34 775

原创 Flutter系列之UI篇:线性布局——Flex,Row,Column

目录导航Flexdirection(children排列方向)mainAxisAlignment(主轴方向上的对齐方式)startFlexFlex类似于Android中的LinearLayout,构造方法如下: Flex({ Key key, @required this.direction, this.mainAxisAlignment = MainAxisAli...

2019-08-06 16:27:34 810

原创 Flutter系列之UI篇:图片显示——Image

`Image`是用来显示图片的`widget`,类似`android`中的`ImageView`。

2019-07-22 14:48:46 1701

原创 Flutter系列之异步篇:Future,Stream,Isolate

Dart是单线程执行模式(single-threaded execution model),Isoalte是对线程的上层封装,代表一个执行环境。不同执行环境(Isolate)之间内存不共享。 Dart的异步操作不一定在另一个线程(Isolate)中执行,而且通常是在同一个线程(Isolate)中执行。

2019-07-21 12:46:44 2408

原创 Flutter系列之UI篇:文本显示——RichText

RichText在App开发中,经常会遇到下面的情况:一个完整的字符串,字体颜色、大小等风格不同,而且部分文本还可以响应点击。在Android中,你可以将两个TextView拼在一起,指定不同的文本颜色,并为第二个TextView设置点击监听器。但这但笨拙了,通常的做法是通过SpannableString/SpannableStringBuilder为不同的文本片段指定不同的span,使其具...

2019-07-08 16:25:38 12297 1

原创 Flutter系列之UI篇:文本显示——Text,DefaultTextStyle

目录导航Text属性配置设置显示的文本文本方向文本对齐方式是否支持换行文本溢出最大行数限制文本风格设置文本垂直方向占据空间的风格配置(行间距、行高等)RichTextTextSpanText.rich VS RichTextDefaultTextStyleTextText继承StatelessWidget,用来显示文本,如Text("Hello,world!"),完整的构造器如下: con...

2019-07-01 11:12:23 7745

原创 Flutter系列之UI篇:flutter与android UI构建的区别—flutter widget VS android view

UI界面的组成元素在Android,UI界面的组成元素是View,一切界面元素都继承View类,由View衍生而来。而Flutter UI界面的组成元素是Widget,任何界面元素均继承Widget。可变性Android中View是可变的,当与用户交互或数据更新时可直接调用invalidate重绘,达到UI更新的目的。Flutter中Widget本身是不可变的(immutable)。那么F...

2019-06-25 10:16:02 1719

原创 Flutter系列之项目篇:入口代码解析

dart程序入口与android MainActivity的衔接。

2019-06-24 09:52:13 1577

原创 Flutter系列之项目&资源篇:项目结构、资源(图片、字符串)存放与引用、添加依赖

新建Flutter项目File→New→New Flutter Project,

2019-06-20 13:46:58 3686

原创 Flutter系列之开篇:环境搭建与配置

目录前言windows平台环境搭建mac平台环境搭建前言我们使用Java语言开发Android App时,需要配置Jdk环境。同样的,Flutter采用Dart语言开发App,所以需要配置Flutter Sdk环境(内置了Dart Sdk)。我们知道,现在风行的跨平台框架如React-Native等采用js作为开发语言。那么,Flutter为什么选择Dart语言?因为Dar...

2019-06-12 22:34:05 336

空空如也

空空如也

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

TA关注的人

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