首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

生存or毁灭?QQ空间150万行代码的涅槃重生 | 技术创作特训营第一期

但后续的需求迅速膨胀,异化出18种 Feeds 流场景,单 Feeds 流可能出现60多种卡片。这导致基类代码与 Feed View 中的代码迅速膨胀。...痛定思痛,在进行空间重构前的首件事情就是总结经验,避免重蹈覆辙。如何保证这次重构平稳落地并且避免后续每三年一重构? 我们总结了四点: 渐进式重构:高速公路换轮胎,如何平稳落地?...代码复杂度持续膨胀; 各业务代码耦合; 功能代码分散,AB 测试不友好; 难以扩展。...比如同一张卡片在不同的页面需要显示不同效果,比如数据埋点的参数需要从页面最外层传递到 Section。...过去,即使传递一个 pageId 参数,也要一层层传递: 现在,层级再深我们也可以很方便拿到需要的 IOC 实现。

65071
您找到你想要的搜索结果了吗?
是的
没有找到

Android-App性能优化

也就是说应用层负责绘制,系统层负责渲染,通过进程间通信把应用层需要绘制的数据传递到系统层服务,系统层服务通过刷新机制把数据更新到屏幕上。...那么我们如何解决呢,主要从两点入手:ui布局,绘制优化和主线程优化? 布局优化 避免ui布局优化可以先从合理使用背景色开始,比如:如果子view和父布局公用一个背景色就没有必要了。...如果应用程序的Activity仍然驻留在内存中,那么应用程序可以避免重复对象初始化、布局加载和渲染,但系统依然会展示闪屏页,直到第一个 Activity 的内容呈现为止。...在生命周期回调的方法中尽量减少耗时的操作 这个里面的优化方式就是:避免I/O操作、反序列化、网络操作、布局嵌套等。...我们先看看一个apk文件有哪些解压后有哪些文件: assets文件夹 存放一些配置文件、资源文件,assets不会自动生成对应的 ID,而是通过 AssetManager 类的接口获取。

2.1K40

iOS的MVC框架之控制层的构建(下)

MVC被众多开发者所诟病的C层的膨胀,究其原因不外乎有如下几点: 所有视图的构建和布局代码都在控制器中完成。...没有关系,本文探讨的是如何解决控制器代码膨胀的问题,而不是掀起派系之争。那么如果我就是要通过代码的方式来完成界面布局呢?毕竟通过代码布局的方式更加灵活和可配置性(牺牲了所见即所得性)。...@end 上面的两种对视图构建和布局进行分解的方式都可以解决在控制器中视图代码构建导致的膨胀问题。...我们也可以通过组合的形式来解决这个问题,但是组合的使用会在一定程度上增加代码量以及共享参数之间的传递问题,因此最佳的解决方案就是采用类继承的方法。...借助接口 通过方法参数和字典是数据传递的两种不同的方式。缺点是一旦界面变化时都需要手动的调整参数位置和个数。

4.4K30

synchronized的实现原理——对象头解密

轻量级锁:在没有多线程竞争,但有多个线程交替执行情况下,避免调用系统函数mutex(特指linux系统)产生的性能消耗。...这个就是synchronized锁膨胀的原理,但并不完全正确,其中还有很多细节,下面就一步步来说明。 对象的内存布局 理论 对象在内存中是如何分配的呢?学过JVM的人应该都知道,如下图: ?...再来看看加锁之后会有什么变化: public static void testLock() { //偏向锁 首选判断是否可偏向 判断是否偏向了 拿到当前的id 通过cas 设置到对象头...注意t1和t2首次都是获取到的偏向锁,并且线程id是相同的,但是按理说线程id应该会变才对,这里笔者猜测为JVM优化,使得线程可以重用,但暂时还无法验证。...总结 本篇是并发系列的第一篇,也是synchronized原理的第一篇,主要分析了锁对象在内存中的布局情况以及锁膨胀的过程,并通过代码验证了所学理论,但synchronized的实现原理是非常复杂的,尤其是优化过后

58330

【JetPack】ViewBinding 视图绑定组件 ( 启用模块 | 视图绑定定制 | 绑定类名称生成规则 | 绑定类字段生成规则 | 绑定类获取根视图 | 绑定类获取布局组件 )

视图绑定布局文件 ---- 下面的绑定类定义了三个 TextView , 前两个定义了 id 分别是 text_view 和 text_view2 , 最后一个没有定义 id ; 该布局作为视图绑定的示例布局...生成的绑定类字段 : 只要在布局文件中定义了 id 属性的组件 , 绑定类中就会为该组件生成相应的字段 ; ① 绑定类字段对应布局 ID : activity_main.xml 布局文件中 , 第一个和第二个...获取视图绑定类组件 ---- 可以直接通过 视图绑定类 ActivityMainBinding 对象 binding 获取对应的组件 , 组件名称就是布局文件中定义的组件 id ; //binding...="true" 属性 , 即不为该布局生成绑定类 * * * 视图绑定 与 findViewById 对比 : 避免了很多问题出现 ; * 空指针优化 : 视图绑定 针对一个布局进行自动生成字段...(binding.getRoot()); //binding 中可以直接通过组件 id 获取对应的组件 binding.textView.setText("ActivityMainBinding

1.2K10

Jetpack组件之DataBinding

首语 Android 布局文件通常只负责UI的布局工作,页面通过setContentView()关联布局文件,再通过UI控件的id找到控件,接着在页面中通过代码对控件进行操作,因此,页面承担了很大的工作量...; 数据绑定 如何将数据传递布局文件中呢?首先,在布局文件中定义布局变量,指定对象的名字和类型,当然数据的操作在标签里。...}" /> DataBinding为了方便使用,对布局变量提供了Setter类,因此,在Activity中,通过setBook(),将Book对象传递布局变量。...一级页面正是通过命名空间xmlns:app引用布局变量book,将数据传递给二级页面的。 需要注意的是,数据绑定不支持include作为merge元素的直接子布局。...需要进行手动更新。 完成双向绑定只需要将布局表达式中的@{}变为@={}即可。username字段会随着EditText内容的变化而变化。

1.2K20

GeometryReader :好东西还是坏东西?

将几何信息传递到上层视图,可能会引起不必要的视图更新。而向下传递信息,可以确保更新只在 GeometryReader 的闭包中进行。 GeometryReader 是布局容器吗,它的布局逻辑是什么?...如果直接将这些负数数据传递给 frame,就可能会出现布局异常(在调试状态下,Xcode 会用紫色的提示警告开发者)。因此,为了进一步避免这种极端情况,可以在传递数据时,将不符合要求的数据过滤掉。...至于如何传递获取的几何信息(例如上文中使用的 @State 或是通过 PreferenceKey),则取决于开发者的编程习惯和场景需求。...与 GeometryReader 不同,满足 layout 协议的布局容器能够在布局阶段就获取到父视图的建议尺寸和所有子视图的需求尺寸。这样可以避免由于反复传递几何数据导致的大量视图的反复更新。...与其说避免使用,到不如说用更加 SwiftUI 的方式来进行布局

53570

探究活动Activity

1.手动创建活动 首先我们创建一个名为ActivityTestDemo的项目。...注意到,既然是手动创建活动,我们在Add an Activity Mobile这个环节就要选择Add No Activity,如下图所示 ?...Desigr是当前的可视化布局编辑器,你可以通过拖动控件的方式来编辑布局,但并不推荐这样做(适用于快速开发),Text是通过XML文件的方式来编辑布局的,现在点一下Text进行切换。...,在这个方法中传入布局文件的id,项目中添加的任何资源都会在R文件中生成一个相应资源的id,所以我们用R.layout.first_layout来找到这个布局文件,并通过setContentView()...Toast首先通过静态方法makeText()创建出一个Toast对象,然后调用show()将Toast显示出来,我们看到makeText()方法中传递了三个参数,第一个参数是Context(也就是Toast

1.3K20

synchronized 优化手段之锁膨胀机制!

偏向锁执行流程 当一个线程访问同步代码块并获取锁时,会在对象头的 Mark Word 里存储锁偏向的线程 ID,在线程进入和退出同步块时不再通过 CAS 操作来加锁和解锁,而是检测 Mark Word...里是否存储着指向当前线程的偏向锁,如果 Mark Word 中的线程 ID 和访问的线程 ID 一致,则可以直接进入同步块进行代码执行,如果线程 ID 不同,则使用 CAS 尝试获取锁,如果获取成功则进入同步块执行代码...Mark Word 扩展知识:内存布局 在 HotSpot 虚拟机中,对象在内存中存储的布局可以分为以下 3 个区域: 对象头(Header) 实例数据(Instance Data) 对齐填充(Padding...Klass Pointer(Class 对象指针) 对象在内存中的布局如下: ?...当关闭偏向锁或者多个线程竞争偏向锁时就会导致偏向锁升级为轻量级锁,轻量级锁的获取和释放都通过 CAS 完成的,其中锁获取可能会通过一定次数的自旋来完成。 ​

40910

CSS动画与GPU

写在前面 满世界的动画性能优化技巧,例如: 只允许改变transform、opacity,其它属性不要动,避免重新计算布局(reflow) 对动画元素应用transform: translate3d...然后按照顺序把这些层的内容依次绘制在一个内部存储空间上(例如bitmap),最后把这个内部表示显示出来,这种做法就是软件渲染(software rendering) 二.transform和opacity的特殊性 以前通过改变布局相关属性形成动画...GPU的数据,由GPU做scale放大展示,视觉效果无差异(多用于纯色背景元素,对不太重要的图片也可以进行5%到10%的宽高压缩),例如: ...例如12道太阳光线旋转,转容器就把容器整张图都发送给GPU,单独转12道光线就去掉了光线之间的11条空隙,能够节省一半内存 5.早早关注复合层的数量和大小 从一开始就关注复合层,尤其是隐式创建的复合层,避免后期优化影响布局...复合层的大小比数量影响更大,但浏览器会做一些优化操作,把几个复合层整合成一个,叫Layer Squashing,但有时一个大复合层比几个小复合层消耗的内存更多,有必要的话可以手动去掉这种优化: //

2.3K30

Android可穿戴设备世界之旅

介绍 Android通过在电视、穿戴和汽车等各种电子模块中扩展下一代应用开发概念,扩展了其整个范围和可能性。本文简要总结和概述了 Android Wear(未来新兴的应用开发平台)中的应用开发。...避免使用用户的传统输入系统,一目了然,将其保持在最低限度,一目了然,为您的手表使用更智能的解决方案,向“Google Now”问好。...您应该实现该接口以检测布局膨胀何时完成。当正确的视图膨胀时,将调用该方法,该方法使用 获取子视图的所需引用。...startActivity(intent); finish(); Log.d("GameActivity:", "Timer >> finished 1 min"); } 在 中,我们将打印传递给此活动的值...,并通过将其保存在 中来跟踪最高分。

9910

用户界面开发基础

---- 在不同Activity之间传递数据 Activity之间切换时,不可避免的要进行数据传递,例如在单击列表中的某个列表项时,小需要编辑与这个列表项相关的数据,这个时候就需要在显示一个Activity...在Android中传递数据的方法很多,介绍4中比较常用的数据传递方法 通过Intent传递数据 通过静态(static)变量传递数据 通过剪切板(Clipboard)传递数据 通过全局变量传递数据 --...代码演示,通过剪切板传递Data对象。...在不同的XML布局文件中可以存在相同ID的视图,但是在同一个XML文件中,虽然也可以有相同ID的视图,但是通过ID获取视图时,只能够获取按照定义的顺序的第一个视图对象,其他相同ID值的视图对象将无法回去...不能只覆盖一个,否则无效 建议将给include标签调用布局设置宽高、位置、ID等工作放在调用布局的根标签中,这样可以避免给include标签设置属性不当造成的各种问题(之前遇到过给include标签设置

1.8K20

编码规范

ID一样,如:类中tvName 对应 布局中 R.id.tvName 3) 全局常量 名称全大写,用“_”分隔。...开头 dialog_confirm ListView item布局文件 lvitem开头 lvitem_rechange 7.资源ID命名 1) 控件 控件 缩写 TextView tv Button...Common类:Pascal自定义属性类:Pascal+后缀Attribute(继承Attribute);(使用较少)自定义异常类:Pascal+后缀Exception(继承Exception);泛型中的传递...类成员变量的声明位置:所有的成员变量都应该声明在顶部,同时使用一个空行来将它们和属性以及方法分开;3、局部变量声明位置:放到方法顶部使用Java预定义类型而不是用类名来声明变量(较少使用)编码逻辑规范1、避免将多个类放在一个文件里...,除非是一次性使用的内部类;2、一个方法的代码长度最好不要超过35行;3、原则上,尽量不要手动去修改系统自动生成的代码;4、final String取代String,int也是一样;5、不推荐在循环语句中

1.2K80

圆填充( CIRCLE PACKING)算法圆堆图圆形空间填充算法可视化

RepelLayout 通过成对排斥迭代移动圆圈来搜索非重叠布局。圆的位置被限制在一个矩形区域内。为避免边缘效应,可以将边界区域视为环面,例如,推到左侧边缘的圆将重新进入右侧边缘的边界区域。...该算法是确定性的,尽管可以通过改变输入圆圈的顺序产生不同的布局。它非常高效,因此适用于处理大型数据集。 GraphLayout 试图找到满足输入邻接图的安排。实现是实验性的。...结果数据集有一个整数 id 字段,它对应于传递给 的原始数据中圆圈的位置。 head(dtg) 现在我们可以绘制布局了。...下面的例子产生一个类似于上图的布局: ## 切线列表。矢量元素是圆 ID。 ##每个向量的第一个元素是一个内圆 ## 和随后的元素是它的邻居。 ## 外圆半径。...,该函数通过将圆放置在靠近边界区域中心的位置,为圆随机分配起始位置。

3.6K30

探索Android复杂页面管理之道-QQ音乐播放页代码演进之路

图 2: 播放页初期MVC结构 在具体实现时: View层由XML布局文件、PlayerActivity实现: xml负责布局 PlayerActivity负责为对应的View控件设置点击事件、进行数据绑定...但是随着QQ音乐的快速发展,作为QQ音乐曝光量最大的页面之一,播放页成为端内重要的推荐宣发入口,承载的功能逐渐增多,PlayerActivity代码行数快速膨胀。...SubControllers的不断增多,导致PlayerActivity对SubController的管理逻辑越来越复杂,代码量也不可避免的开始二次膨胀。...: RxJava: 优点: 支持冷热Observable,对数据流的操作有丰富的API支持; 缺点: 上手困难,需要手动注册和解注册,源码复杂问题定位困难,需要手动实现支持replay; EventBus...对于尚未存在的依赖,我们合适的父节点进行按需构造: 如在准备图18中X模块的依赖时,由于在模块树的根节点PlayerActivity中已经构造了IPlayerBaseViewModel实例,因此我们只需要将改实例传递

3.5K40
领券