项目开发优化技巧总结
一、RecycleView 优化
RecycleView在开发时可以考虑以下优化的方案:
1. 数据处理和视图加载分离
a. 数据的处理逻辑尽可能放在异步处理,onBindViewHolder方法只做数据填充视图的操作。
b. 对ItemView设置监听器,不要对每一个Item都调用addxxListener,可以考虑公用一个xxListener,根据ID的不同来操作,优化了对象的频繁创建带来的资源消耗。
2. 数据加载优化
a. 分页拉取远端数据,并对拉取下来的数据进行缓存,尽可能提升二次加载速度。
b. 对于新增的或者删除数据通过 DiffUtil 进行局部数据的刷新,尽量不进行全局数据刷新。
c. 对于使用库版本在25.1.0及以上的时候使用Prefetch功能。
补充:
a. DiffUtil 推荐博客和项目地址:https://github.com/mcxtzhang/SupportDemos、【Android】RecyclerView的好伴侣:详解DiffUtil
b. Prefetch 推荐博客地址:RecyclerView Prefetch功能探究。
3.布局优化
a. 减少布局层级,简化ItemView。
b. 如果Item高度是固定的话,可以使用RecycleView.setHasFixedSize(true)来避免requestLayout浪费资源。
c. 如果多个RecycleView的Adapter是一样的,比如嵌套的RecycleView中存在一样的Adapter,可以通过设置RecycleView.setRecycleViewPool(pool),来共用一个RecycleViewPool。
二、项目启动优化
我们知道有很多第三方组件(包括App应用本身)都在 Application 中完成初始化操作。但是在 Application 中完成繁重的初始化操作和复杂的逻辑就会影响到应用的启动性能。
通过分析一下,我们可以知道还是有机会优化这些工作以实现冷启动的性能改进的,分析后发现影响冷启动时间的常见问题如下:
- 复杂繁琐的布局初始化
- 阻塞主线程 UI 绘制的操作,如 I/O 读写或者是网络访问.
- 其它占用主线程的操作
我们可以根据这些组件的轻重缓急之分,对初始化做一下分类 :
- 必要的组件一定要在主线程中立即初始化(入口 Activity 可能立即会用到)
- 组件一定要在主线程中初始化,但是可以延迟初始化。
- 组件可以在子线程中初始化。
在进行优化的时候,需要注意以下几种情况:
- 放在子线程的组件初始化建议延迟初始化,这样就可以了解是否会对项目造成影响!
- 将需要在主线程中初始化但是可以不用立即完成的动作延迟加载(初始化放在 Application 中统一管理为妙,不建议放在Activity里面)
- 可以尝试将常见的组件库,例如 Bugly,x5内核初始化,SP的读写,友盟等组件放到子线程中初始化。(子线程初始化不能影响到组件的使用)
在优化好启动时间后,我们就可以在针对闪屏页的时间,进行调整优化,具体公式为:闪屏页展示总时间 = 组件初始化时间 + 剩余展示时间。
推荐的优化方案:
1). 合理的使用异步初始化、延迟初始化、懒加载机制。
2). 提前加载SharePreferences,可参考:SharedPreferences异步加载。
3). 类加载优化:提前异步执行类加载。
4). 合理使用IdleHandler进行延迟初始化。
三、常见的内存问题及优化方案
1. 内存泄漏
内存泄漏的定义是:内存中存在已经不再使用,但是并未回收的对象。表现的现象为:内存出现抖动和可用内存逐渐变少。存在的危害是:会造成内存不足,GC频繁,甚至出现OOM。
常见引发内存泄漏的主要情况有如下情况:
1. static 关键字修饰的成员变量
核心点:被static修饰过的成员变量的生命周期 = 应用程序的生命周期。
泄漏原因:若被static修饰的成员变量引用短生命周期的实例,则容易出现该成员变量的生命周期 > 引用实例生命周期的情况,当引用实例需结束生命周期销毁时,会因静态变量的持有而无法被回收,从而出现内存泄露。
解决方案:
a. 尽量避免static成员变量引用资源消耗过多的实例(若需引用Context,则尽量使用Application的Context)。
b. 使用弱引用WeakReference代替强引用持有实例。
经典案例 ==》单例模式
核心点:单例模式 其生命周期的长度 = 应用程序的生命周期
泄漏原因:若1个对象已不需再使用 而单例对象还持有该对象的引用,那么该对象将不能被正常回收 从而 导致内存泄漏
解决方案:单例模式引用的对象的生命周期 = 应用的生命周期。 或者编写代码保证在合适的时机释放资源。
2. 非静态内部类/匿名类
核心点:非静态内部类默认持有外部类的引用,可能会导致外部类对象无法释放,造成内存泄漏。
解决方案:使用静态内部类。
经典案例 ==》Runnable、AsyncTask、Thread、Handler 等类
3. 资源使用后未关闭
泄露原因:对于资源的使用(如 广播BraodcastReceiver
、文件流File
、数据库游标Cursor
、),若在Activity
销毁时没有及时关闭或注销这些资源,则这些资源将不会被回收,从而造成内存泄漏。
解决方案:在Activity
销毁时 及时关闭 / 注销资源
2. 内存抖动
核心原因:频繁创建大量、临时的小对象。
排查方向:优先寻找循环或者频繁调用的地方进行排查。
优化方案:避免创建大量、临时的小对象。
3. 内存溢出
请参考:Android OOM 引发的思考。这里就不过多整理了。
项目开发优化技巧总结相关推荐
- JavaScript开发优化技巧
JavaScript开发优化技巧 1.按字符串属性值对对象数组进行排序 可以通过不同的方式来完成. 1).使用Underscore _.sortBy(collection, [iteratees=[_ ...
- 【Vuejs】953- Vue 项目性能优化技巧分享
来自:知乎,作者:小可乐程序员 链接:https://zhuanlan.zhihu.com/p/83180326 前言 Vue 框架通过数据双向绑定和虚拟 DOM 技术,帮我们处理了前端开发中最脏最累 ...
- React + TS项目开发小技巧总结
一.react hook知识 1.基本使用 最常用的Hook,有两个:useState.useEffect import React, { useState } from "react&qu ...
- web前端开发常用的优化技巧汇总
减少HTTP请求的次数或者减少请求数据的大小 页面中每发一次HTTP请求,都需要完成请求+响应这个完整的HTTP事务,会消耗一些时间,也有可能导致HTTP链接通道的堵塞,为了提高页面的加载速度和运行的 ...
- 【Day11】平时在项目开发中都做过哪些前端性能优化
平时在项目开发中都做过哪些前端性能优化 一.体验优化 二.提升页面性能 三.首页加载优化(减少白屏时间) 一.体验优化 从用户角度而言,优化能够让页面加载得更快.对用户的操作响应得更及时,能够给用户提 ...
- Silverlight C# 游戏开发:项目开发实例和小技巧索引
Silverlight C# 游戏开发:项目开发实例和小技巧索引 相比于技术文章而言,本索引中包含的都是独立的项目,争取按照每个独立的项目开发来编写系列,全部为原创,开发过程可能语无伦次,可能相当幼稚 ...
- java 多项目_Java开发小技巧(三):Maven多工程依赖项目
Maven多工程依赖项目开发流程 前言 本篇文章基于Java开发小技巧(二):自定义Maven依赖中创建的父工程project-monitor实现,运用我们自定义的依赖包进行多工程依赖项目的开发. 下 ...
- 学成在线项目开发技巧整理---第一部分
学成在线项目开发技巧整理---第一部分 1.数据字典 2.http-client远程测试插件,可以保存测试数据 3.三种跨域解决 4.具有多层级数据查询思路 5.Mybaits分页插件原理 6.根据文 ...
- 7.3.项目开发设计流程规范与技巧
一个项目从客户提出需求,到需求分析,再到设计.开发.测试等,经过一系列的环节后,才能达到正式使用和上线的效果. 为了标准化开发流程,提高开发效率,特将项目开发的一下规范和技巧,做一些说明. 项目开发流 ...
最新文章
- 泪目!兰大硕导的《致谢》火了:我从来不曾优秀过,也从来不曾放弃过!
- GPU 实现 RGB -- YUV 转换 (OpenGL)
- 50万年薪程序员,被百万网民怒喷后,却迎来大撕逼
- [css] 行内元素和块级元素有什么区别,如何相互转换?
- switch芯片和phy芯片的区别_感应式芯片卡CPU卡的FM1208-9和FM1208-10有什么区别,你知道吗?...
- android中保存Bitmap图片到指定文件夹中的方法
- python防止sql注入的方法_python解决sql注入以及特殊字符
- LeetCode简单题目(#172 #189 #190 #191 #198 #202)-6道(序列、数字)
- 猎头人生, FOR IT Candidate 转CSDN
- 通过C语言编程一个小游戏(乐趣无边)
- PatterNodes for Mac(创建图形模式)
- 计算机多媒体作业是什么,多媒体计算机技术作业一
- Hibernate用Query删除数据表中的数据的问题(EntityManager.clear())
- 超详细Seaborn绘图 ——(一)barplot
- 深耕模具细分领域20载 德惠创新研发领跑行业
- 四轴飞行器资料分享,几个G ,66个文件,如果链接失效请私聊我
- 算法训练 逗志芃的危机
- linux服务器防病毒,Linux服务器防病毒实战(3)
- 小米note连接手机,root
- 【后台端】OA办公后台管理系统高保真Axure原型模板
热门文章
- 关于android 自定义TitleBar 会遇到的问题
- (操作系统题目题型总结)第六章:文件管理
- [leetcode]687. Longest Univalue Path
- hadoop常见算法(持续更新)
- vijos 1057 盖房子 dp 最大子正方形
- .xib .plist .pch
- c#中datagridview里checkbox的使用方法[转]
- 考考你,能看出这一段代码是用哪个编程语言写的吗?
- Simulink之变压器隔离的直流-直流变换器
- mysql 5.0.22_mysql-5.0.22安装