
架构
文章平均质量分 92
OpenHarmony_小贾
这个作者很懒,什么都没留下…
展开
-
Android终极大招之全面取代drawble文件实现View圆角背景样式的新方案
最近一直忙于音视频SDK的开发,遇到很多问题,简单来说,就是怎么让别人接入SDK时越简单越好。相信大多数Android开发都会遇到一个场景,给TextView或Button添加背景颜色,修改圆角,描边等需求。一看到这样的实现效果,自然就是创建drawble文件,设置相关属性shap,color,radius等。然后将drawble文件设置给对应的view即可实现想要的效果。但是作为一个SDK,如果不同的app都需要修改自己独特的颜色,圆角等需求,如何以最小的改动来满足不同app的需求呢?原创 2023-11-24 17:25:41 · 187 阅读 · 0 评论 -
层层剥开Android14升级后异常弹框的神秘面纱
通过从源代码的角度分析安卓 14升级后出现双弹窗异常的原因,并根据调查结果提出解决方案,可以更好地定位问题并实施有效的修复措施。这种方法需要对系统和应用程序的源代码进行深入的检查和理解,并确保修复后的应用程序在新系统上能够正常运行。原创 2023-11-21 16:55:44 · 4576 阅读 · 7 评论 -
温故知新:探究Android UI 绘制刷新流程
这就是我遇到的问题:单纯的根据TextView在子线程可以更新得出的结论,总的来说要想不崩溃还得绕过中的的检测。至于研究它有什么用,只有知道理解源码的流程,才能写出更好的东西。原创 2023-11-09 15:54:30 · 569 阅读 · 1 评论 -
如何在Jetpack Compose中显示PDF?
这样, 我们就可以绕过使用。原创 2023-11-08 20:51:11 · 768 阅读 · 0 评论 -
从内存优化视角再看 Glide 图片加载库
Glide 作为常用的图片加载框架,框架层面已经对内存方面有不少优化,但作为一个图片框架,确保正确性一定是第一位的,因此在应用层还可以在适当的场景做一些额外的优化,当然你需要了解优化设置可能产生的问题。由于图片设置了 centerCrop 属性,在直观看图片会按等比居中缩放,但由于 decode 发生在 scaleType 生效之前,因此使用 Glide 加载图片时会以 ImageView 的实际尺寸(即全屏) 的宽高来解码图片,由此产生了不必要的内存开销。为了帮助到大家更好的掌握好 开源框架相关知识点,原创 2023-11-07 16:25:24 · 593 阅读 · 0 评论 -
Android 复杂UI界面分模块解耦的一次实践
通过定义不同的ItemBinder将页面划分为不同模块,实现UI和交互解耦,单个ItemBinder也可以在其他页面进行复用。通过后台数据动态的添加ItemBinder页面组装更灵活。任务分拆,提高开发效率。原创 2023-11-03 18:01:11 · 746 阅读 · 0 评论 -
Android RecyclerView — 实现自动加载更多
在App中,使用列表来显示数据是十分常见的。使用列表来展示数据,最好不要一次加载太多的数据,特别是带图片时,页面渲染的时间会变长,常见的做法是进行分页加载。本文介绍一种无感实现自动加载更多的实现方式。原创 2023-10-30 16:19:19 · 633 阅读 · 0 评论 -
Android存储:轻松掌握MMKV
MMKV 是基于 mmap 内存映射的 key-value 组件,底层序列化/反序列化使用 protobuf 实现,性能高,稳定性强。从 2015 年中至今在微信上使用,其性能和稳定性经过了时间的验证。近期也已移植到 Android / macOS / Win32 / POSIX 平台,一并开源。可以看出它也可以用于替代 SP,操作也与 SP 类似,相较于 DataStore 更好上手,所以我干脆也写一篇文章介绍下如何使用 MMKV。原创 2023-10-26 15:41:50 · 324 阅读 · 0 评论 -
云音乐Android Cronet接入实践
Cronet是 google chromium 的网络组件,可单独编译成库提供给 Android/Ios 应用使用。Cronet在性能方面表现出色,目前已经有 Youtube、Goolge 全家桶等大量应用使用 Cronet 作为网络模块。支持 HTTP2/QUIC/websocket 协议支持对请求设置优先级标签可以使用内存缓存或磁盘缓存来存储资源支持 Brotlin 压缩(有研究表明,对于文本文件,相同的压缩质量下,brotlin 通常比 gzip 高出了20%的压缩率)原创 2023-10-25 16:04:10 · 990 阅读 · 0 评论 -
MMKV源码解读与理解
通过 mmap 技术实现的高性能通用 key-value 组件。同时选用 protobuf 协议,进一步压缩数据存储。标准 protobuf 不提供增量更新的能力,每次写入都必须全量写入。考虑到主要使用场景是频繁地进行写入更新,我们需要有增量更新的能力:将增量 kv 对象序列化后,直接 append 到内存末尾;这样同一个 key 会有新旧若干份数据,最新的数据在最后;那么只需在程序启动第一次打开 mmkv 时,不断用后读入的 value 替换之前的值,就可以保证数据是最新有效的。原创 2023-10-19 15:00:00 · 383 阅读 · 0 评论 -
如何共享 Android 不同模块的构建配置
为了解决上面的问题,我们自然很容易想到要把其中可以共享的配置抽取出来,然后在每个 module 中引用这些配置。我们可以编写 1 个预编译插件 AndroidLibraryPlugin,在其中去处理这些共享的构建逻辑,然后在需要的 module 中引用这个插件。原创 2023-10-16 17:00:00 · 464 阅读 · 0 评论 -
[Framework] Android Handler 工作原理
在 Android Framework 中有两个主要的主线程Handler,一个是中的H,它主要来处理四大组建的各种生命周期;还有一个是中的,它主要负责绘制,动画,输入等操作。这两个Handler负责的工作和用户体验都极为密切,主线程也可以说非常忙。在项目中我经常发现很多的代码都会在主线程执行,明明有的操作不需要主线程执行。原创 2023-10-10 10:30:00 · 143 阅读 · 0 评论 -
Android架构灵魂组件Lifecycle的生命周期机制详解
在早期 Andorid 架构中,生命周期的事件监听和状态查询,我们需要自定义一套提供侦测功能的 Activity/Fragment 基类及回调接口,在 Activity/Fragment 的生命周期方法中实现依赖组件的操作,在外部进行事件监听和状态查询。这种模式会导致代码条理性很差而且会扩散错误。在 Lifecycle 引入后,可以避免在 Activity/Fragment 生命周期方法内写太多的业务逻辑处理代码,这样可以使我们的业务逻辑更加解耦。原创 2023-09-25 16:19:20 · 415 阅读 · 0 评论 -
Android Bitmap复用高性能设计,你要的细节全在这里
从上面的代码逻辑中,可以了解到,Glide 本质上还是利用了 Android 中的 Bimtap 的复用特性进行封装设计的,不同的版本使用不同的缓存策略。使用了合理的数据结构,比如,不会覆盖相同 key 的图片,能够增加复用命中的概率大量使用了对象缓存池的思想,防止内粗的抖动。比如等Android 4.4 以后的策略,考虑了最优解,找到最合适的 Bitmap 的内存最小值,防止内存复用的浪费。比如一个10*10的图片,用了一个200*200的 Bitmap。原创 2023-09-24 17:59:42 · 559 阅读 · 0 评论 -
RecyclerView刷新后定位问题
做需求开发时,遇到RecyclerView刷新时,通常会使用notifyItemXXX方法去做局部刷新。但是刷新后,有时会遇到RecyclerView定位到我们不希望的位置,这时候就会很头疼。这周有时间深入了解了下RecyclerView的源码,大致梳理清楚刷新后位置跳动的原因了。原创 2023-09-18 17:13:42 · 398 阅读 · 0 评论 -
Android应用开发架构之MVI:原理、流程与实战指南
在现代的Android应用开发中,构建可维护、可扩展且具备响应式特性的架构变得越来越重要。在本文中,我们将介绍一种新颖的架构模式:MVI(Model-View-Intent)。我们将详细讲解MVI架构的原理和流程,并通过具体的代码示例进行实战演示。同时,我们还会分享一些在实际工作中的经验和解决的问题。此外,我们将与MVVM和MVP架构进行对比,探讨MVI架构的优点和如何弥补其缺点。MVI架构通过响应式数据流和单向数据流的特性,提供了一种可维护、可测试且具备响应式特性的架构模式。原创 2023-09-07 14:10:59 · 947 阅读 · 0 评论 -
剪辑App的MMKV应用优化实践
移动端开发中,IO密集问题在很多时候没有得到充足的重视和解决,贸然的把IO导致的卡顿放到异步线程,可能会导致真正的问题被掩盖,前人挖坑后人踩。其实首先要想的是,数据存储方式是否合理,数据的使用方式是否合理。本文介绍度加剪辑对MMKV的使用和优化。全文14813字,预计阅读时间38分钟。原创 2023-09-05 15:03:26 · 339 阅读 · 0 评论 -
RecyclerView的smooth scroller -- 诸多案例
以及了解了LinearSmoothScroll到底是如何进行smooth scroll的, 即 “普通smooth scroll + 当发现了target时就开始减速smooth”. 这个能帮助我们理解何时要重写哪些方法.原创 2023-09-04 21:02:55 · 332 阅读 · 0 评论 -
RxJava的前世【RxJava系列之设计模式】
一个比较书面化的定义是:在对象之间定义一个一对多的依赖,当一个对象状态改变的时候,所有依赖的对象都会自动收到通知。通俗一点理解,假如说有两种对象,一个是观察者,一个是被观察者,当一个被观察者对象发生变化的时候,可以通知到所有的观察者对象。所有的观察者对象在接收到这个通知的时候,可以做一些自己的处理。可以通俗地理解为,在不改变原有对象的基础上,增强原有对象的功能。本篇文章内容就到这里了,其实本篇文章没有提到RxJava的具体知识,但其实处处都有RxJava的影子。原创 2023-09-02 21:22:00 · 1061 阅读 · 0 评论 -
Android Glide使用姿势与原理分析
Android Glide是一款强大的图片加载库,提供了丰富的功能和灵活的使用方式。本文将深入分析Glide的工作原理,并介绍一些使用姿势,助你更好地运用这个优秀的库。自定义图片压缩策略通过实现接口实现。该接口包含方法,可以在其中定义自定义的压缩操作。// 自定义压缩算法return "customTransformation" // 返回唯一标识符,用于缓存// 自定义压缩算法实现// ....load(url)通过实现接口,你可以根据需求制定不同的压缩算法,以满足特定的图片压缩需求。原创 2023-09-01 14:17:04 · 1683 阅读 · 0 评论 -
最详细的 Android View 的事件分发原理
Android 的 View 的事件分发一直是老生常谈的问题,市面上的所有文章资料都在通过 dispatchTouchEvent、onInterceptTouchEvent 和 onTouchEvent 讲事件分发的原理,对于一些细节没有涉及,本文带你一窥源码,搞清楚 View 是如何选择事件处理的。后续的步骤也会涉及这个变量。这个步骤主要是处理非 DOWN 事件的(除了事件序列的起始事件),因为起始事件回去创建新的触摸目标,而后续的事件可以直接交给 TouchTarget 来进行,避免再次查找提高效率。原创 2023-08-29 15:44:31 · 443 阅读 · 0 评论 -
ARouter基本使用及原理分析
ARouter是阿里开源的一款帮助Android App进行组件化改造的路由框架,是Android平台中对页面和服务提供路由功能的中间件,可以实现在不同模块的Activity之间跳转。ARouter的特点是灵活性强还能帮助项目解耦。除了广为人知的Activity跳转之外,ARouter还支持获取Fragment,解耦服务使得跨模块API调用等等ARouter使用@Route注解,在编译时期通过APT技术生成类文件用于存储path和activityClass的映射关系。原创 2023-08-17 15:25:00 · 688 阅读 · 0 评论 -
谈一谈在两个商业项目中使用MVI架构后的感悟
当时项目采用MVP分层设计,组员的代码风格差异也较大,代码中类职责赋予与封装风格各成一套,随着业务急速膨胀,代码越发混乱。试图用MVI架构单向流形成掣肘带来一致风格。但这种做法不够以人为本,最终采用“在MVP的基础上进行了适当改造+设计约定的方式”解决了问题,并未将MVI投入到商业项目中,于是放弃了纸上谈兵。在半年前终于有机会在商业项目中进行实践,同诸位谈一谈使用后的个人感悟,并藉此讲透MVI等架构。从架构的理念出发 –简单列明各种MVX的理念MVX:指代 MVC、MVP、MVVM、MVI。原创 2023-08-11 15:42:39 · 1472 阅读 · 0 评论 -
Android跨进程传大图思考及实现——附上原理分析
文件中的,我们看上面测试的两个例子,其中有一个传了。原创 2023-07-29 21:51:30 · 1005 阅读 · 1 评论 -
RecyclerView优化实战指南
RecyclerView 是 Android 的一个高级 UI 组件,用于展示大量数据。它可以自动回收不可见的视图,并且可以使用不同的布局管理器来实现不同的布局。RecyclerView 还提供了一些回调函数,允许你在视图复用时进行一些自定义操作。RecyclerView 可以大大简化开发过程,但是如果不进行优化,它可能会导致一些性能问题。下面将介绍一些优化技巧,帮助你充分发挥 RecyclerView 的性能。原创 2023-07-28 14:41:51 · 239 阅读 · 0 评论 -
坑爹的shadow -- 总结 与 各种坑
最近公司来了新UX总监, 很喜欢给设计添加浓重的, 而且是好几层的阴影. 这下就苦了我们Android开发了. 因为是Android不支持啊, 巧妇也难为无米之炊啊. (折中方法也不是没有, 就是自己把阴影做个view, 但它的blur这些比较麻烦, 做过Android的都知道这个Blur要用到BlurScript之类, 做起来不容易)以下图中一个矩形有阴影为例, 它的shadow是有多种参数的, 主要就是: offsetX, offsetY, blur, spread, color & alpha. Ux原创 2023-07-25 15:10:23 · 443 阅读 · 0 评论 -
ViewModel实例什么时候被回收
以下代码是在Activity.java中定义的:在Activity和Activity的子类中都没有找到有赋值的地方,因为修饰符是package的,于是在其相同包名下,通过Find in files查找到是在ActivityThread.java的handleRelaunchActivity()中赋值为true的。@Override// ...// 这里会在屏幕旋转Activity重建时执行,将activity.mChangingConfigurations赋值为true// ...原创 2023-07-19 15:45:18 · 606 阅读 · 0 评论 -
拥抱组件化开发,手淘项目内部架构分享
亲戚 (或未来丈母娘) : 你现在干啥呢?我:我是做Android的,换种方式说 ,是做app、做手机应用的,就你手机上这一个个应用就是我 们做的亲戚 (未来丈母娘) : “那你能不能做个淘宝、微信啊?面对这种疑问,我们也只能笑一笑,毕竟淘宝是200多人同时开发的结晶。经历10多年的版本迭 代。形成了如今高性能淘宝应用,凭一人之力无法做出完整淘宝项目,当然了,我们也可以仿淘宝做做 UI界面。但做出来的壳子对技术提升来说没有什么意义。原创 2023-07-18 21:45:05 · 218 阅读 · 0 评论 -
浅谈下mvc和mvp、mvvm到mvvm+Jetpack
……原创 2023-07-18 15:00:27 · 2253 阅读 · 1 评论 -
电商公司Android 面试总问组件化相关内容
4轮面试,两轮面试都被问到组件化问题,面试的点各不相同,有组件化架构设计、插件化框架设计、路由架构设计、热修复设计等问题,但是最终都是殊途同归,所有的问题都汇集在这,如何对手机淘宝组架构设计?原创 2023-07-12 21:06:45 · 142 阅读 · 0 评论 -
从 Component Tree 视角看 Dagger 到 Hilt 的演变
在组件的定义上,和@Component没有区别,需要以此声明组件依赖的 module(非必须),注入的目标,以及创建子组件所需要的工厂。此外还需要一个自定义作用域注解,它是@Scope的派生类,表明当前子组件的生命周期。dagger.android 没有存在模板代码,所以诞生了 Hilt,后者的思想是通过 “预定义” 的方式彻底消灭模板代码。plugins {相对于 dagger.android 帮我们生成, Hilt 中索性不允许自定义的 subcomponent,提供了预定义的。原创 2023-07-12 14:52:49 · 156 阅读 · 0 评论 -
什么是热修复?它的优缺点是什么?
热修复就是通过下发补丁包,让已安装的客户端动态更新,用户不用重新安装APP,就能够修复软件缺陷。原创 2023-07-10 21:21:48 · 576 阅读 · 0 评论 -
自定义View控件流程是怎样的?
根据Android Developers官网的介绍,自定义控件需要以下步骤。(根据业务需要,某些步骤可省略)1、创建View2、处理View的布局3、绘制View4、与用户进行交互5、优化已定义的View上面五项就是Android官方给出的自定义控件步骤。每个步骤里面又包括了很多细小的知识点。可以记住这五个点,并且了解每个点里包含的小知识点。再加上一些自定义控件的练习。将这些知识熟练于心,相信开发者都能够定义出优秀的自定义控件。接下来对上面列出的5个要点进行细化阐述。原创 2023-07-10 15:33:58 · 142 阅读 · 0 评论 -
解锁Android开发利器:MVVM架构
作为Android开发者,我们都希望能够开发出高效、可维护和可测试的应用。而MVVM(Model-View-ViewModel)架构正是我们的得力助手。在本文中,我将详细介绍MVVM架构的原理和流程,并通过一个示例演示如何使用MVVM进行应用开发。让我们一起解锁Android开发的利器!原创 2023-07-08 21:00:25 · 935 阅读 · 0 评论 -
Jetpack 架构组件你了解多少?
我们直接就使用 上文定义的 User 类来改造@Entityvar id: Long = 0 //给每个实体类都添加一个字段,并设为主键@Entity注解:将User声明成了一个实体类注解:将id字段设为主键,将设置为true,使得主键的值自动生成这一部分比较关键,因为所有访问数据库的操作都是在这里封装@Dao@Insert@Update@Delete@Dao注解:让Room能够识别到UserDao是一个Dao@Insert注解:表示将参数传入User。原创 2023-07-07 21:43:32 · 219 阅读 · 0 评论 -
Android 为什么设计只有主线程更新UI?
通过分析总结几个点。1.一般UI还是要保证同一时刻只有一个线程在更新,所以效率不会更高。2.多线程更新UI实现上会复杂一些,Java的内部人员发布过文章也说过这个几乎不可实现。3.从响应速度角度分析,单线程可以设计出更好的响应速度的api4.单线程更新,也是一个被证明效果非常好的方案。从过个角度分析 Android 为什么设计只有主线程更新UI 都是最好的选择。不过回答这个问题需要理解的不全是结论,而是对这个问题,和图形界面开发的理解。如果说效率高,安全,也需要回答出来为什么。原创 2023-07-05 22:21:07 · 407 阅读 · 0 评论 -
关于LiveData全面详解(附事件总线)
MVVM 架构模式中,ViewModel 是不会持有宿主的信息,业务逻辑在 ViewModels 层中完成,而不是在 Activities 或 Fragments 中。LiveData 在里面担任数据驱动的作用:以往我们使用 Handler,EventBus,RxjavaBus 进行消息通信,LiveData 也是一个种观察者模式,作用跟 RxJava 类似,是观察数据的类,相比 RxJava,一般配合 Jetpack 组件配合使用。原创 2023-07-03 15:31:46 · 1839 阅读 · 0 评论 -
RecyclerView 实现WheelView和省市区多级联动
滚轮经常在选择中用到,主要包括类型选择省市区联动选择年月日联动选择等。项目中的WheelView一般都是组合完成的。但是自定义起来比较复杂,也有一些优秀的第三方库DateSelecter 通过Adapter的思想来灵活解决自定义的问题。但是既然用到了Adapter的思想,那为啥不利用来实现呢?,毕竟我们比较熟悉也方便和项目中现有的Adapter复用。于是我基于对Adapter低侵入性,逻辑单独封装成支持通过Adapter自定义WheelView样式支持横向和竖向支持自定义。原创 2023-07-01 20:52:15 · 879 阅读 · 2 评论 -
你可以不用RxJava,但必须得领悟它的思想!
它是基于特殊的观察者模式来实现的,能够轻松的实现异步事件响应流,避免回调地狱的产生。这种思维和我们平时的编程思维不太相同,它以数据流为核心,处理数据的输入,处理以及输出,因此这个框架学习起来是有一定难度的,加之RxJava操作符众多,这又给初学者立了个下马威。本篇博客会分析其原理与思想,从源码层次对其进行深入分析。✔️ 本文阅读时长约为:10min本篇博客适合已经会简单使用RxJava框架并想了解其原理与思想的同学~原创 2023-06-21 14:14:26 · 271 阅读 · 0 评论 -
Android滴滴路由框架DRouter原理解析
最近的一个新项目使用了Clean Architecture+模块化+MVVM架构,将首页每个tab对应的功能都放到单独的模块且不相互依赖,这时就有了模块间页面跳转的问题,经过一番研究选择了滴滴的DRouter,因为其出色的性能、灵活的组件拆分,更重要的是生成路由表时支持插件增量编译、多线程扫描,运行时异步加载路由表,支持回调式ActivityResult,比ARouter好太多。原创 2023-06-10 15:37:48 · 1636 阅读 · 0 评论