自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Android UI:布局控件(ViewGroup)

第一次遍历,测量所有子控件的宽高,累计totalWeight和totalLength,比较设置maxWidth或maxHeight,totalLength是累计子控件的宽或高,totalWeight是累计子控件设置的weight,maxWidth或maxHeight是子控件中的最宽值或最高值。子控件的属性weight决定其自身和其他设置属性weight的子控件的宽度或高度,但不会影响未设置属性weight的子控件的宽度或高度。比例 = View的weight/(比例的总和-上一个View的weight)

2025-01-07 15:41:15 804

原创 Android UI:View:Scroll

移动是从显示内容中的指定位置开始显示剩下的内容滑动计时器类似动画,一段时间内,将横向坐标从A变到B,竖向坐标从C变到D,在这期间内,可以随时计算获取两个坐标的变化值追踪MotionEvent,获取用户滑动的速度和方向滑动,指的是当手指离开屏幕时,继续滑动一段时间computeScroll()在View的draw方法中被调用ScrollView重写computeScroll()方法,使用Scroller计算滑动距离,使用scrollTo并更新View形成循环直到时间结束。

2025-01-06 11:49:56 1085 1

原创 Android 第三方框架:图片加载:Glide:源码分析:缓存

利用LinkedHashMap实现Lru在磁盘缓存中,作为目录或者映射表在内存缓存中,作为存储的数据结构。

2025-01-03 20:59:23 1274 2

原创 Android 第三方框架:网络框架:OkHttp:源码分析:缓存

不存在内存缓存,只存在磁盘缓存磁盘缓存。

2025-01-03 20:25:43 1365

原创 Java:缓存:LinkedHashMap实现Lru

Least Recently Used,最近最少使用,包括两个原则1.最近原则,即最久未被使用,越久未被使用越应该被优先删除2.最少原则,即记录使用次数,使用次数越少越应该被优先删除如果没有旧Value,直接添加到链表的尾部如果有旧Value,新的Value替换旧的Value,将该结点从链表中摘除,并添加到链表的尾部从链表中删除结点如果查找到,针对链表的操作是:将该结点从链表中摘除,并加入链表的尾部增/改、查操作都可能影响原有结点在链表中的查找顺序,只要能查找到,就将结点放在链表的表尾,即越在链表的后部越

2025-01-03 19:45:33 917

原创 Android系统:多线程:线程并发:任务、线程、线程池

实现接口ExecutorService实现三个submit方法三种情况,两种处理第一种:当前线程个数小于corePoolSize的情况下,尝试创建线程,传入Runnable对象,启动该线程第二种:当前线程个数不小于corePoolSize且线程池正在运行的情况下,尝试将Runnable加入workQueue第三种:当前线程个数不小于corePoolSize且线程池不在运行或向workQueue中添加Runnable失败的情况下,尝试创建线程,传入Runnable对象,启动该线程。

2024-12-31 06:49:40 657

原创 Android 第三方框架:RxJava:源码分析:责任链模式

链式调用的使用过程中形成了两个单向链表1.首先调用Observable的静态方法创建第一个Observable对象,作为Observable链表的表尾2.调用当前的Observable对象的实例方法,创建新的Observable对象,新的Observable对象持有当前Observable对象,向Observable链表添加表头,3.最后调用Observable对象的subscribe方法,Observable链表创建完成Observable链表用于传递Observer对象,创建Observer链表1.最后

2024-12-11 07:13:51 326

原创 Android UI:ViewTree:源码分析:事件处理:显示事件

显示事件包含测量、布局、绘制事件无论是测量、布局、绘制事件,相同的模式ViewGroup做两件事1.向下分发2.处理该事件View做一件事1.处理该事件调用setFrame方法调用onLayout方法设置mLeft、mTop、mRight、mBottom为空方法调用LayoutTransition的layoutChange方法调用super.layout(...)方法。

2024-12-10 15:23:21 1108

原创 Android 第三方框架:RxJava:源码分析:观察者模式

以Observable、ObservableOnSubscribe、Observer为例负责发射事件或数据负责对从被观察者中获取的数据进行最后的处理,即调用Observer所在的外部类的代码Observer作为内部类可以直接调用其方法,完成最后的处理同时也是触发事件或数据变化所在的类将从Observable获取到的数据或事件进行某种数据处理或者事件操作,将处理后的结果交给ObserverObservable直接依赖Observer,直接调用Observer的方法Observable依赖ObservableO

2024-12-05 14:32:20 669

原创 代码设计:设计模式:观察者模式

实现响应式编程的代码设计,即触发事件或数据变化时,将数据从被观察者类通过观察器传递给观察者处理,即被观察者类间接调用观察者类的方法处理事件或数据。

2024-12-05 14:10:29 559

原创 Android 第三方框架:图片加载:Glide:源码分析:生命周期的同步

生命周期的同步,指的是UI线程与一个或加载线程的同步,即UI线程中的Activity/Fragment/View的生命周期方法控制加载的流程。

2024-12-05 05:18:58 1143

原创 代码设计:设计模式:应对变化

代码的设计模式主要为了应对变化三种代码设计中应对变化的方式1.拆分代码2.解耦3.扩展解耦就是解除类之间的耦合关系。

2024-11-30 09:49:57 856

原创 Android 第三方框架:RxJava:概述

将数据交给结点A,结点A对数据进行处理,将处理后的数据交给下一个结点B,结点B对数据进行处理,将处理后的数据交给下一个结点,... ...当前结点上处理数据,将处理结果放入缓冲区,下一个结点从缓冲区取出处理结果。第二步,将线程串联起来,上一个线程执行完成后,将处理的结果交给下一个线程。当前结点处理数据的速度过快,下一个结点处理速度不匹配,导致缓冲区溢出。解决方法:流量控制,减少结点上要处理的数据的数量或频率。举例:获取的URL数据,访问网络获取新的数据。第一步,将不同的数据处理交给不同的线程处理。

2024-11-28 07:11:16 256

原创 代码设计:设计模式:责任链模式

为请求创建一个接收者对象的链,将请求传入链表表头进行传递在传递过程中,每个接收者对前一个接收者的操作结果进行操作,将操作后的结果传递给下一个接收者。

2024-11-11 17:43:52 285

原创 编程语言:语法

举例:Java中的Set和List,List是顺序存储,Set是无序存储。方法的参数列表是引用类型,方法对传入引用变量的操作即对原变量的操作。举例:Java中的Set和List,Set不可重复,List可重复。方法的参数列表是值类型,方法对传入变量的操作会不会影响原变量。原变量和方法中的变量是两个变量,互不影响。数字类型,包括整数类型、小数类型。包括系统提供的和自定义的类型。两个引用变量指向一个变量。定义变量/常量的表达式。

2024-10-24 14:09:41 252

原创 编程思想:编程范式:响应式编程

响应一般指对于事件的响应,事件包括数据变化或其他事件响应流程包括事件的发生,事件的传递,和事件的最终处理事件在起点处发生,开始传递过程传递过程,包括对事件的一系列处理,如事件封装的数据的类型转化,数据集合的批处理事件最终传递到终点,响应处理过的事件。

2024-10-11 03:50:32 399

原创 Android系统:系统架构

Android的系统结构的设计混合了分层设计和分块设计。

2024-09-23 10:10:12 657

原创 编程思想:占位思想

参数化,编译时用XXX占位,运行时用XXX替换。

2024-09-18 09:37:25 253

原创 编程思想:静态与动态:编译时和运行时

编译时,对应的是静态运行时,对应的是动态。

2024-09-18 09:20:47 387

原创 编程思想:静态与动态

文章目录 懒加载和预加载 编译时和运行时 总结 懒加载和预加载​​​​​​​编译时和运行时总结

2024-09-18 09:20:35 203

原创 编程思想:编程范式:面向对象

类A继承类B,类A隐式持有一个类B对象,类A中可以直接调用类B的可继承属性和方法。编译时,在类中定义引用变量时,使用父类作为变量的类型,使用引用变量调用重写方法。运行时,把子类的实例对象赋值引用变量,调用的重写方法实际上调用的是子类中的方法。在子类中持有父类对象,可直接调用父类的方法,本质上是持有的父类对象调用方法。重写:子类的实例对象调用重写方法,调用的是子类中的方法,不是父类中的方法。父类中的方法,使用super,标明调用的是父类中的方法。类的封装,把抽象出来的相同的属性和方法封装在类中。

2024-08-26 07:01:05 335

原创 Android UI:PopupWindow:源码分析:设置WindowManager.LayoutParams中的各种参数

mIsDropdown可以通过set方法直接设置,也可通过调用showAtLocation(设置为false)或调用showAsDropDown(设置为true)mXXXMode可通过调用setWindowLayoutMode设置,可设置为MATCH_PARENT或WRAP_CONTENT。调用showAsDropDown,设置为anchor.getApplicatonWindowToken()调用showAtLocation, 设置为parent.getWindowToken()

2024-08-21 08:01:41 551

原创 Android UI:PopupWindow:API

持有一个View对象和一个WindowManager对象,将外部传入的View对象通过WindowManger.addView的方式显示在屏幕上。屏幕的装饰器,如NavigatonBar。数值越小,Window越靠近屏幕。

2024-08-20 08:41:31 2118

原创 代码设计:设计模式:过滤器模式

使用不同的标准来过滤/筛选一组对象。

2024-08-16 05:23:57 300

原创 代码设计:设计模式:中介者模式

作为中介者1.间接实现的A调用B的方法2.实现A与B的松耦合,B的代码变化尽量不影响A的代码。

2024-08-16 04:56:20 237

原创 代码设计:设计模式:桥接模式

桥接模式核心思想是从原有类抽取出独立功能的接口,类似工厂模式、Builder模式都是抽取出独立功能的类。

2024-08-16 04:26:31 402

原创 代码设计:设计模式:委托模式

委托,指的是调用被依赖的类的方法类A依赖类B,一般都是A调用B的方法,但委托是B调用A的方法。

2024-08-15 15:56:30 558

原创 代码设计:设计模式:抽象工厂和工厂方法

工厂方法,一个工厂生产多个产品抽象工厂,一个工厂生产一个产品​​​​​​​抽象工厂可以看作工厂方法的升级,当工厂方法中工厂类代码过于复杂,可以将其改成为抽象工厂,降低工厂类的代码复杂。

2024-08-15 12:16:31 193

原创 架构设计:架构设计与框架设计的区别

通常设计的是一个模块/组件/插件的结构,模块/组件/插件一般涉及一个单独的功能/业务,所以不需要分块设计,只需分层设计。通常设计的是系统/App的结构,系统/App涉及多个功能/业务,使用分层设计+分块设计。

2024-08-07 09:33:15 220

原创 Android 线程并发:线程通信:AsyncTask

线程池负责提供完成任务的子线程Handler实现子线程和UI线程的通信通信流程:1.UI线程将【参数】传给子线程2.子线程获取【参数】,处理,将【结果】传给UI线程3.子线程中将【处理进度】传给UI线程4.UI线程获取【处理进度】,最终获取结果。

2024-07-31 22:18:24 497

原创 Android 线程并发:线程通信:Handler机制

发送消息自定义Handler重写handleMessage方法,处理Message获取App的UI线程的Looper对象创建Looper对象开启死循环获取当前线程的Looper对象获取MessageQueue对象获取Thread对象获取HandlerThread对象对应的Looper对象

2024-07-24 17:14:25 495

原创 Android 适配:版本适配

Android 7只需要重写ViewGroup的generateLayoutParams方法,创建需要的LayoutParmas@OverrideAndroid 15 需要重写ViewGroup的generateLayoutParams方法和generateDefaultLayoutParams方法@Override@Override。

2024-07-23 09:49:14 419

原创 Android 源码分析:ViewGroup

如果要自定义ViewGroup,对添加到其中的View对应LayoutParams有特殊要求(如需要是MarginLayoutParams),可重写ViewGroup.generateDefaultLayoutParams()和ViewGroup.generateLayoutParams()如果调用的是ViewGroup.addView(View),会调用ViewGroup.generateDefaultLayoutParams()创建需要的LayoutParamas对象。

2024-07-23 09:41:27 530

原创 代码设计:设计模式:访问者模式

类结构定义多个重载的抽象方法,方法用于访问不同的数据,方法传入数据类型实现抽象类或接口,实现多个重载的抽象方法,完成具体的数据访问并没有建立紧密的耦合关系,而是通过定义方法的参数为对方类型,建立松耦合关系访问者相关代码数据访问代码总结

2024-06-23 16:55:17 263

原创 Android 第三方框架:网络:OkHttp:源码分析:拦截器

将传入的Interceptor对象放入OkHttpClient.interceptors中OkHttpClient.interceptors最早添加到Interceptor的责任链中被添加到所有系统定义的Interceptor之前。

2024-06-21 09:16:38 699

原创 Http协议:Http缓存

http缓存重要问题在于如何实现客户端与服务端的数据同步更新问题。

2024-06-14 07:19:52 640 1

原创 Android:UI:Drawable:View/ImageView与Drawable

调用传入的Drawable.Callback的invalidateDrawable方法。

2024-06-11 15:04:12 521

原创 编程语言:语法:创建类的全局变量在声明时创建与在构造器中创建的区别

意味着无论创建对象时,使用的是哪个构造器,该变量都会被创建。在构造器中创建,类似懒加载,用时加载,不一定会被创建。构造器中创建,代表该变量根据不同的需求确定是否创建。意味着只有使用这个构造器时,变量才会被创建。在声明时创建,类似预加载,一定会被创建。声明时创建,代表该变量一定会创建。

2024-06-11 10:08:12 330

原创 编程思想:静态与动态:预加载与懒加载

预加载和懒加载就是App启动时和App运行时。

2024-06-11 10:07:40 410

原创 Android UI:Drawable:DrawableContainer

DrawableContainer封装一组Drawable,不同的DrawableContainer实现Drawable不同的展示方式。

2024-06-08 11:08:13 678

空空如也

空空如也

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

TA关注的人

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