| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 移动开发 -> Android高级进阶之12条代码优化以及性能优化方案,flutter下载sdk -> 正文阅读 |
|
[移动开发]Android高级进阶之12条代码优化以及性能优化方案,flutter下载sdk |
SparseLongArray <Integer, Long>
ongSparseArray <Long, Object> 对比存放1000个元素的SparseIntArray和HashMap<Integer, Integer> 如下: SparseIntArray class SparseIntArray { Class = 12 + 3 * 4 = 24 bytes Array = 20 + 1000 * 4 = 4024 bytes Total = 8,072 bytes HashMap class HashMap<K, V> { Class = 12 + 8 * 4 = 48 bytes Entry = 32 + 16 + 16 = 64 bytes Array = 20 + 1000 * 64 = 64024 bytes Total = 64,136 bytes 可以看到存放相同的元素,HashMap占用的内存几乎是SparseIntArray的8倍。 SparseIntArray的缺点 SparseIntArray采用的二分查找法来查找个keys,因此查找某个元素的速度没有Hashmap的速度快。存储的元素越多时速度比hashmap的越慢,因此当当数据量不大时可以采用SparseIntArray,但是当数据量特别大时采用HashMap会有更高的查找速度。 6、自定义view中在layout、draw、onMeasue中new对象问题代码 pubic class myview extends View public myview(Context context) { } 自定义view的时候经常会重写onLayout ,onDraw ,onMeasue方法,但是要注意的是,如果在这些方法里面new 对象就会有如下问题 优化代码 public class myview extends View 看下Android官网上的解释为什么不能在onLayout ,onDraw ,onMeasue方法里面执行new 对象和执行初始化操作:
上面的意思总结一下就是在自定义view的时候最好提前初始化和new 对象,因为onDraw,onMeasure,onLayout的方法调用十分频繁,如果在这里初始化和new 对象会导致频繁的gc操作严重影响性能,也可能会导致掉帧现象。 ondraw的调用时机 1、view初始化的时候。 2、当view的invalidate() 方法被调用。什么时候会调用invalidate()方法呢?当view的状态需要改变的时候,比如botton被点击,editText相应输入等,就会reDraw调用onDraw方法。 7、静态变量引起的内存泄漏问题代码 public class MyDlg extends Dialog { private View mDialog; 上面的代码会导致如下问题: 上面代码中静态变量sInstance持有来context而这里的context是持有当前dialog的activity,由于静态变量一般只有在App销毁的时候才会进行销毁(此时类经历了,加载、连接、初始化、使用、和卸载)所以当activity执行完时由于被dialog中的静态变量持有无法被gc,所以造成内存泄漏。而这种dialog如果被多个地方调用就会造成严重的内存泄漏。 8、overdraw问题问题代码 <?xml version="1.0" encoding="UTF-8"?>
上面代码中linearlayout的background和ScrollView 里面的background一样只需要保留父布局LinearLayout里面的background就行了,不然会多进行一次绘制也就是引起overdraw问题。 9、inefficent layout weight问题代码 <LinearLayout <android.support.v7.widget.SwitchCompat 上面布局中一个linearLayout里面包含一个textview和一个SwitchCompat,textview中的layout_weight=“1”,此时也明确给出了textview的layout_width=“165dp”,这个时候会带来下面的问题 当linearLayout的布局里面只有一个子view使用weight属性时如果LinearLayout是垂直布局这个子view应该设置layout_height=“0dp”,如果是水平布局这个子view应该layout_width=“0dp”,这样执行onMeasure的时候会首先不去measure 这个布局,可以提高性能。 10、字符串操作优化String text=“bitch”; 上面代码中1和2哪个代码性能更好?第二种性能更高,第一种方式会先new一个“fuck”+text的字符串然后在append到StringBuilder中,而第二种方法中不用new一个字符串,所以性能更高。 代码优化1、消除redundant “Collection.addAll()”原始代码: ArrayList lists = null; 优化代码: ArrayList lists = null; 2、使用array的copy方法原始代码: for(int i=0;i<ITEM_SIZE;i++){ 优化代码: System.arraycopy(contents, 0, mContentsArray, 0, ITEM_SIZE); #文末 希望读到这的您能转发分享和关注一下我,以后还会更新技术干货,谢谢您的支持! 转发+点赞+关注,第一时间获取最新知识点 Android架构师之路很漫长,一起共勉吧! 以下墙裂推荐阅读!!!
转发+点赞+关注,第一时间获取最新知识点 Android架构师之路很漫长,一起共勉吧! 以下墙裂推荐阅读!!! |
|
移动开发 最新文章 |
Vue3装载axios和element-ui |
android adb cmd |
【xcode】Xcode常用快捷键与技巧 |
Android开发中的线程池使用 |
Java 和 Android 的 Base64 |
Android 测试文字编码格式 |
微信小程序支付 |
安卓权限记录 |
知乎之自动养号 |
【Android Jetpack】DataStore |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 7:42:17- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |