- 博客(138)
- 资源 (1)
- 收藏
- 关注
原创 DeepSeek深度思考:客户端(Android/iOS)架构设计指南
DeepSeek深度思考,教你如何进行客户端(Android/iOS)架构设计
2025-02-08 11:35:42
1435
原创 RxSwift系列(六)UI控件扩展
RxSwift是一个用于与 Swift 语言交互的框架,但它只是基础,并不能用来进行用户交互、网络请求等。而是让 Cocoa APIs 更容易使用响应式编程的一个框架。RxCocoa 能够让我们方便地进行响应式网络请求、响应式的用户交互、绑定数据模型到 UI 控件等等。而且大多数的 UIKit 控件都有响应式扩展,它们都是通过 rx 属性进行使用。
2024-10-08 13:37:32
757
原创 RxSwift系列(五)特征序列
● 只能发出一个元素,或一个error 事件● 不会共享状态变化● 不会发出任何元素● 只会发出一个 completed 事件或者一个 error 事件● 不会共享状态变化● 发出一个元素、或者一个 completed 事件、或者一个 error 事件● 不会共享状态变化ControlProperty 是专门用来描述 UI 控件属性,拥有该类型的属性都是被观察者(Observable)。ControlProperty 具有以下特征:● 不会产生 error 事件。
2024-10-07 12:43:57
916
原创 RxSwift系列(三)调度器subscribeOn、observeOn
(1)调度器(Schedulers)是 RxSwift 实现多线程的核心模块,它主要用于控制任务在哪个线程或队列运行。(2)RxSwift 内置了如下几种 Scheduler:● CurrentThreadScheduler:表示当前线程 Scheduler。(默认使用这个)● MainScheduler:表示主线程。如果我们需要执行一些和 UI 相关的任务,就需要切换到该 Scheduler运行。● SerialDispatchQueueScheduler:封装了 GCD 的串行队列。
2024-10-06 14:43:59
417
原创 RxSwift系列(二)操作符
buffer方法作用是缓冲组合,第一个参数是缓冲时间,第二个参数是缓冲个数,第三个参数是线程。缓存 Observable 中发出的新元素,当元素达到某个数量,或者经过了特定的时间,它就会将这个元素集合发送出来。
2024-10-01 10:44:07
1187
1
原创 RxSwift系列(一)Observable、Observer、Subjects
有时我们想让 UI 控件创建出来后默认就有一些观察者,而不必每次都为它们单独去创建观察者。比如我们想要让所有的 UIlabel 都有个 fontSize 可绑定属性,它会根据事件值自动改变标签的字体大小。方式一:对 UI 类进行扩展//Observable序列(每隔0.5秒钟发出一个索引数)observable.bind(to: label.fontSize) //根据索引数不断变放大字体方式二、对 Reactive 类进行扩展。
2024-10-01 10:16:33
1093
原创 Android开发系列:高性能视图组件Surfaceview
在Android应用开发领域,面对视频播放、游戏构建及相机实时预览等高性能需求场景,直接操控图像数据并即时展示于屏幕成为必要条件。性能瓶颈:传统View的绘制任务由UI主线程承担,如果绘制操作过于复杂或需要频繁刷新,就可能导致主线程阻塞,进而影响界面的响应速度和用户交互体验。视觉瑕疵:传统View组件缺乏双缓冲技术的支持,View直接屏幕绘制易引发画面闪烁及图像撕裂。效果局限:传统View组件基于视图层次结构,每个View都被视为一个矩形区域,这使得实现不规则形状、透明度变化等复杂视觉效果变得相对困难。
2024-06-16 21:01:54
2120
原创 iOS开发系列:基于VNRecognizeTextRequest识别图片文字
在项目设置中点击"General"选项卡,然后在"Frameworks, Libraries, and Embedded Content"(框架、库和嵌入内容)部分,点击"+"按钮。搜索并选择"Vision.framework"。
2024-05-26 20:32:16
767
原创 CocoaPods安装及‘__rvm_make -j8‘处理
CocoaPods是一个用Ruby写的、负责管理iOS项目中第三方开源库的工具,CocoaPods能让我们集中的、统一管理第三方开源库,为我们节省设置和更新第三方开源库的时间。1.查看ruby版本ruby -v2.通过rvm来安装或升级Ruby,依次执行3.列出ruby可安装的版本信息显示结果,最新版本3.0.04.(提前安装)如果没安装的话,安装ruby时会自动下载安装Xcode、Command Line Tools for Xcode、Homebrew。5.安装3.0.0。
2024-01-01 11:45:07
1294
原创 Android开发系列:IdleHandler闲时加载
在之前的文章里,我们讲过关于handler的一些使用和原理。今天讲一个系统预留的一个handler,IdleHandler,有了它,可以让我们在系统闲时进行一些预加载或者事务处理。
2024-01-01 11:22:42
951
原创 Webview+AppbarLayout上下滑动冲突
当AppBarLayout和Webview共同使用时,会出现一个问题,AppBarLayout无法折叠了,Webview只能在较小的固定区域内上下滑动,可以理解为两者上下滑动冲突了。
2022-09-03 16:27:48
1479
原创 Webview+Viewpager左右滑动冲突
在开发场景中,经常需要Viewpager+Fragment嵌套滑动页面。然而若某个Fragment为webview,且webview中存在轮播图或者其他滑动控件,则会出现Webview内容无法左右滑动的问题。
2022-09-03 15:35:13
2397
2
原创 Android TextView显示不全问题
场景在写布局UI的时候,LinearLayout下水平方向有ImageView和Textview。ImageView固定尺寸,TextView设置了maxLines和ellipsize属性。运行发现,textview内容较多时,会有显示不全的问题。原因分析LinearLayout父容器下,左侧的ImageVIew控件设置了高度,xml默认情况下一行。此时图片控件高度较高,视图绘制时就固定了该父布局的高度。当页面加载数据时,文字超出一行,LinearLayout不会重新绘制把高度变大,所以
2021-06-24 11:59:01
5547
转载 Android进阶:RecyclerView中DiffUtil的使用
一、概述DiffUtil是support-v7:24.2.0中的新工具类,它用来比较两个数据集,寻找出旧数据集-》新数据集的最小变化量。说到数据集,相信大家知道它是和谁相关的了,就是我的最爱,RecyclerView。就我使用的这几天来看,它最大的用处就是在RecyclerView刷新时,不再无脑mAdapter.notifyDataSetChanged()。以前无脑mAdapter.notifyDataSetChanged()有两个缺点:不会触发RecyclerView的动画(删除、新增、位移
2021-05-23 00:39:43
5511
1
原创 Android进阶:Protocol Buffer协议的使用
一、背景说起数据交互协议,相信大家最熟悉的就是xml和json了,尤其是json,广泛应用于web项目和移动端项目中。其实,还有一种协议,Protocol Buffer,简称Protobuf,得益于它的一些特性,越来越多的公司在开发中使用Protobuf代替json。二、简介1、概念Protobuf,在官网(https://developers.google.com/protocol-buffers)上的定义描述是:Protocol buffers are Google’s language-n
2021-05-22 14:09:32
1606
2
原创 设计模式:装饰器模式
一、概述装饰器模式(Decorator Pattern),从分类上讲,属于结构型模式。它是作为现有的类的一个包装。该模式允许动态地给一个对象添加一些额外的职责。同时又不改变其原有结构。主要应用场景:一般,我们使用继承方式扩展一个类。然而随着扩展功能不断增多,子类会逐渐膨胀。而装饰器模式就是为了解决这个问题的。它抽离出核心功能和扩展功能。从而进行动态扩展而无需创建新的继承子类。二、UML图 抽象组件角色(Component): 定义可以动态添加任务的对象的接口 具体
2021-02-19 10:28:37
161
1
原创 Android开发系列:TextView绘制(四)过程分析
整体流程onMeasure -> onLayout -> onDrawonMeasureprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int widthMode = MeasureSpec.getMode(widthMeasureSpec); int heightMode = MeasureSpec.getMode(heightMeasureSpec); int width.
2020-12-31 17:01:27
1190
1
原创 Android开发系列:TextView绘制(三)DynamicLayout
DynamicLayout官网中,DynamicLayout描述如下DynamicLayout is a text layout that updates itself as the text is edited.This is used by widgets to control text layout. You should not need to use this class directly unless you are implementing your own widget or cus
2020-12-30 16:43:24
1759
1
原创 Android开发系列:TextView绘制(二)StaticLayout
StaticLayout官网中,StaticLayout的描述如下:StaticLayout is a Layout for text that will not be edited after it is laid out. Use DynamicLayout for text that may change.This is used by widgets to control text layout. You should not need to use this class directly
2020-12-26 10:27:18
1982
1
原创 Android 报错处理:ActivityNotFoundException: No Activity found to handle Intent
场景在跳转外部浏览器的时候val uri: Uri = Uri.parse(url)val intent = Intent(Intent.ACTION_VIEW, uri)activity.startActivity(intent)发现部分机型有时会闪退,报错 ActivityNotFoundException: No Activity found to handle Intent可能原因外部没有可以处理该intent的组件。可能是外部浏览器初始化的问题。因为在出现闪退几次之后在进行调用,发
2020-12-24 21:14:13
4897
原创 Android开发系列:TextView绘制(一)BoringLayout
前言在Android开发中,TextView是一个很基础的控件。但看过它的源码你就会发现他其实一点都不简单。毕竟他也是不少view的父类。其中包含了很多布局、逻辑和计算。之前一直想有空就研究一下来着的。那么现在就开始吧。这篇先讲TextView中三大布局(BoringLayout、StaticLayout、DynamicLayout)中最简单的BoringLayout。BoringLayout在官网中,BoringLayout的描述如下:A BoringLayout is a very simp
2020-12-23 20:40:42
1247
1
原创 Android:富文本中ReplacementSpan绘制隐藏bug
概述近日碰到一个有趣的bug。具体情况是:通过HTML.fromHtml的方式给TextView设置富文本内容。通过TagHandler.handleTag方法,处理自定义标签。在文本中插入一个自定义ReplacementSpan。然而,当我的自定义span的宽度变化时,存在一个临界值,会使得该自定义ReplacementSpan有时绘制不出来。(正常应该如第二个图所示)原因我在tagHandler中使用了空格占位,替换自定义spanoutput.append(" ");output.se
2020-12-20 13:35:07
909
1
原创 Gradle学习:Groovy基本使用
一、概述Groovy是一种动态语言。它和Java一样,也运行于Java虚拟机中。它基于Java并扩展了Java。动态语言,是指运行时才确定数据类型的语言,变量在使用之前无需申明类型。例如JavaScript、Python。相对的,编译时变量的数据类型就可以确定的语言为静态语言,例如Java、C++。它是一种面向对象的语言,同时也能作为一种纯粹的脚本语言。Groovy内部会把代码编译为Java class文件然后启动虚拟机来执行(实际上,由于Groovy Code在真正执行的时候已经变成了
2020-12-14 20:22:33
534
原创 H5:MathJax解析数学公式
一、概述MathJax是一款开源的JavaScript显示引擎,适用所有现代浏览器,使用MathJax可以方便的在浏览器中显示数学公式,不需要使用图片。目前,MathJax可以解析Latex、MathML和ASCIIMathML的标记语言。MathJax官网:MathJax官网Github地址:MathJax Github中文文档地址:MathJax中文文档英文文档地址:MathJax英文文档MathJax语法:MathJax语法二、安装1、引入MathJax使用网络字体(大部分浏览器都
2020-11-09 14:51:25
3642
原创 设计模式:责任链模式
一、概述责任链模式,从分类上讲,是23种设计模式中的一种行为设计模式。责任链模式(Chain of Responsibility Pattern),顾名思义,为请求创建了一个接收者对象的链,对请求的发送者和接收者进行解耦,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。使用场景:在处理消息的时候需要多级过滤或处理。举个栗子,OA请假申请,各级领导审批权限和次序是不同的,请求就在链条上传递,直到审批处理。二、UML图三、..
2020-11-06 17:34:08
163
原创 设计模式:策略模式
一、概述策略模式,从分类上讲,是23种设计模式中的一种行为设计模式。策略模式(Strategy),定义了一组算法,将每个算法都封装起来,并且使它们之间可以互换。主要解决在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护。举个栗子,出行方式有多种,我们可以根据距离选择飞机、高铁、汽车等不同的出行策略。二、UML图Context是上下文,用一个ConcreteStrategy来配置,维护一个对Strategy对象的引用;Strategy是策略类,用于定义所有支持算
2020-11-03 11:08:00
124
原创 Android framework(四):应用程序启动过程
概述1、几个重要类Instrumentation:监控应用程序和系统的交互。ActivityManagerService:组件管理调度中心。ActivityStarter:Activity启动控制器,处理Intent与Flag对Activity启动的影响,具体说来有:1 寻找符合启动条件的Activity,如果有多个,让用户选择;2 校验启动参数的合法性;3 返回int参数,代表Activity是否启动成功。ActivityStackSupervisor:Activity启动和调度的核心类,主要管
2020-10-16 19:33:05
434
原创 Android:软键盘
软键盘显示1、WindowSoftInputMode九种状态(6+3)(控制软键盘显示还是隐藏)stateUnspecified:默认状态。不指定软键盘显示还是隐藏,将由系统选择合适的状态。stateUnchanged:保留状态。当前界面的软键盘状态,取决于上一个界面的软键盘状态。stateHidden:隐藏状态。向前导航到当前页面时隐藏软键盘。stateVisible:显示软键盘。向前导航到当前页面时显示软键盘。上个页面返回时不显示。stateAlwaysHidden:始终隐藏软键盘 。向前
2020-10-12 20:17:06
875
1
原创 Kotlin: Coroutines协程学习笔记(二)
设置超时通过withTimeoutOrNull设置协程的超时时长,如果超时将会返回 nullval result = withTimeoutOrNull(1300L) { repeat(1000) { i -> println("I'm sleeping $i ...") delay(500L) } "Done" // 在它运行得到结果之前取消它}println("Result is $result")运行结果:I'm sl
2020-09-17 10:10:35
335
原创 Kotlin: Coroutines协程学习笔记(一)
一、什么是协程协程是一种协作式的计算机程序并发调度的实现,程序可以主动挂起或者恢复执行,本质上,协程是轻量级的线程。二、协程和线程的关系和区别1、协程是协作式的,线程是抢占式的。协程是由程序来控制什么时候进行切换的,而线程是有操作系统来决定线程之间的切换的。2、一个线程可以包含多个协程。但是有一点必须明确的是,一个线程的多个协程的运行是串行的。3、和多线程比,协程没有线程切换的开销,执行效率更高,性能更具优势。因而协程适合io密集型的程序,多线程适合计算密集型的程序(适用于多核cpu的情
2020-09-02 20:45:11
267
原创 Android framework(三):SystemServer进程
一、概述SystemServer是Android系统的核心之一,大部分Android提供的服务都运行在这个进程里,SystemServer中运行的服务总共有60多种。为了防止应用进程对系统造成破坏,Android的应用进程没有权限直接访问设备的底层资源,只能通过SystemService中的代理访问。通过Binder,用户进程在使用SystemService中的服务并没有太多不便变之处。上一节已经讲到ZygoteInit的启动,那么ZygoteInit是如何启动SystemServer的呢二、fork
2020-08-01 15:44:00
21162
原创 H5:border-radius移动端的兼容问题
问题场景通过以下方式实现一个圆形边框的选项值.option { width: 40px; height: 40px; border-radius: 50%; text-align: center; line-height: 40px; font-size: 36px; color: #888888; border: 2px solid #888888;}在chrome和其他浏览器上一直显示正常。在个别移动端机子上,出现圆圈不圆和
2020-08-01 11:26:26
1171
原创 Android framework(二):Zygote进程
一、概述zygote,在英语中是受精卵的意思。而在Android系统中也有这么一个“受精卵进程” – Zygote进程。在Android系统中,Zygote进程是所有Android进程的父进程。它通过fork的形式,创建SystemServer进程和应用程序进程。而Zygote进程则是通过linux系统的init进程启动的。在Android系统中各种进程的启动过程:init进程 ––> Zygote进程 ––> SystemServer进程 ––>各种应用进程其中,应用程序进程
2020-06-30 20:53:35
550
原创 H5:救命技能之Webstorm恢复被删文件
今天,整理代码的时候操作不慎,多删除了项目文件,因为文件大,连回收站也清空了,想起来有部分代码未提交欲哭无泪!重写是不想重写的,于是试了几个数据恢复软件,免费版专业版都用上了,发现还没恢复成功.......想起来,Webstorm还有本地记录,于是抱着试试的心态(大不了重写),幸好恢复了。这里衷心感谢Webstorm!!简直救命!恢复步骤1、工程项目,右键打开 local history2、左边选择最近的一条本地记录,点击,右边选择误删想恢复的目录或文件,点击Revert .
2020-06-15 20:35:22
1033
原创 H5:html2canvas使用笔记
场景描述:在H5页面需要生成截图,用于分享给其他用户。可以通过开源库html2canvas实现这一功能。官方文档github -> https://github.com/niklasvh/html2canvas使用文档 -> http://html2canvas.hertzen.com/documentation安装//这里最好指定安装版本,原因见下文npm i html2canvas@1.0.0-rc.4使用import html2can...
2020-06-05 16:12:47
7489
转载 手机屏幕尺寸大全
在进行前端页面开发时,有时候需要根据手机进行适配,为避免每次查找麻烦,贴一个手机屏幕尺寸大全,数据来源:优设网-屏幕尺寸大全iPhone 11 Pro iOS 5.8 458 19 : 9 375 x 812 1125 x 2436 3.0xxhdpi iPhone 11 Pro Max iOS 6.5 458 19 : 9 414 x 896 1242 x 2688 3.0xxhdpi iPhone 1..
2020-06-01 11:36:58
4307
原创 Android framework(一): 系统架构及源码
虽然实际开发工作经常偏业务和应用层,但作为一个有追求的程序猿,对于技术还是要保留好奇和深入了解的习惯的。年轻就要多学习!不仅要知其然,还要知其所以然。故趁闲暇,博览大家,研究一下frameworks相关知识,提升自己。Android四层架构从高到低分别是应用层、框架层、运行库层、Linux内核层。Android的本质是在标准的Linux系统上增加了Java虚拟机Dalvik/ART,并在Dalvik/ART虚拟机上搭建了一个JAVA的application framework,所有的应用程序都是基
2020-05-27 21:28:40
789
原创 H5:微信分享接入及避坑记录
前言项目中经常有这样的需求,某个页面需要分享到微信好友或朋友圈。在app中,可以通过接入sdk,调用sdk的方法实现分享。在H5中实现微信分享也是需要借助sdk。微信JS-SDK是微信公众平台面向网页开发者提供的基于微信内的网页开发工具包。通过使用微信JS-SDK,网页开发者可借助微信高效地使用拍照、选图、语音、位置等手机系统的能力,同时可以直接使用微信分享、扫一扫、卡券、支付等微信特有的能力。不过在接入微信js-sdk之前,类似app注册应用账号一样,需要做些前置的准备工作。此处贴一.
2020-05-23 17:34:07
2325
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人