Android性能优化(第二章)
这章就当填坑了,姑且也算是性能优化吧
⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄
0x00 集合处理
对一些list和数组的操作其实Java已经帮我们做了不少功课了,回想起来在一些使用场景中笔者还傻乎乎的写一堆for each (滑稽),这里就当提个醒。
场景一:
List和数组的转换,这个看官应该都很了解了,这里还是贴出来做下记录。
数组 → List Arrays.asList()
传入可变参数类型。例如
//一般写法
List<String> strList=Arrays.asList("1","2");
List<String> strList=Arrays.asList(new String[]{"1","2"});
值得一提的是这里有个隐藏的坑,上述写法是错误的,再用这个List的时候调用add,remove这些method时出现Java.lang.UnsupportedOperationException异常。这是由于Arrays.asList() 返回java.util.ArraysArrayList,而不是ArrayList。ArraysArrayList, 而不是ArrayList。ArraysArrayList和ArrayList都是继承AbstractList,remove,add等method在AbstractList中是默认throw UnsupportedOperationException而且不作任何操作。ArrayList override这些method来对list进行操作,但是Arrays$ArrayList没有override remove(),add()等,所以会throw UnsupportedOperationException。
//正确写法
List<String> strList=new ArrayList<String>(Arrays.asList("1","2"));
List<String> strList=new ArrayList<String>(Arrays.asList(new String[]{"1","2"}));
场景二:
要快速填充默认数据的数组:
Arrays.fill();
例如
String strs=new String[10];
Arrays.fill(strs,"haha");
这样就能将tests的数组中都填充haha
这个字段,这个方法还支持起始位置和末了位置。
List同理Collections.fill()
场景三:
数组的排序看官也应该很熟悉了,值得一提的是,对数组进行Object排序时
Arrays.sort(Object[] objects,Comparator comparator)
一般是写个匿名实现类来完成排序,也可以重新在Bean对象中重写Comparable接口,对的你没看错,Comparable和Comparator 两个接口的区别在于Comparable是一个类需要内部实现,而Comparator 是外部调用的解析实现。2者都实现时sort方法优先外部调用,也就是Comparator 的compare,Comparator 和Comparable 的实现方法返回值含义相同,1排到后面,-1排到前面,0不变。
场景四:
求数组中某个value的index。好像终于可以摆脱自己for each的实现了,突然间就激动了起来呢。(滑稽)
Arrays.binarySearch()
传入数组和要查找的对象就可以了。对于实体bean的处理有几个点要注意下,
1.不像List集合重写equals
方法,执行indexOf
就能定位到索引,在binarySearch
的源码中的实现方式很不幸的发现不是依赖于equals
,而是基于二分查找和Comparable
来实现的。
核心方法:
public static int binarySearch(Object[] array, int startIndex, int endIndex, Object value) {checkBinarySearchBounds(startIndex, endIndex, array.length);int lo = startIndex;int hi = endIndex - 1;while (lo <= hi) {int mid = (lo + hi) >>> 1;@SuppressWarnings("unchecked")int midValCmp = ((Comparable) array[mid]).compareTo(value);if (midValCmp < 0) {lo = mid + 1;} else if (midValCmp > 0) {hi = mid - 1;} else {return mid; // value found}}return ~lo; // value not present}
也就是说compareTo
返回0的时候才能定位到准确的位置,笔者这里认为,compareTo
去做一些equals
的活有点不太妥当。Arrays.binarySearch()
不过这个方法对于基本类型的索引还是值得一用的。
0x01 屏幕适配
这里补上笔者当初一个坑,
场景:
UI:开发我把图切好了,1x,2x,3x,够了吗(其实我是把给IOS的图顺便给你了)
我:够了够了,(我有dp约束,用一套不颗粒化就OK)
说完我就把2x的随手放到了drawable-hdpi里面,dp一约束,低分辨,中等分辨,高分辨一跑,OK收工,心中还窃喜,还给APK节省了点空间(^__^)
后来在一些新建的工程中研究控件的时候定位了到了这个问题,明明初始化只渲染一些背景图,Monitors 中显示占用内存100M+,最后笔者进行了一些测试
测试一:
ImageView控件,真机samsung S7,1440*2560,测试图片为真机截屏
放置路径 | wrap_content | 180dp*320dp | Glide加载 |
---|---|---|---|
drawable | 230.1 | 228.0 | 11.3 |
drawable-mdpi | 230.3 | 228.1 | 11.3 |
drawable-hdpi | 105.5 | 104.3 | 11.3 |
drawable-xhdpi | 60.7 | 62.2 | 11.2 |
drawable-xxhdpi | 28.9 | 30.8 | 11.3 |
drawable-xxxhdpi | 18.1 | 19.9 | 11.0 |
测试二:
ImageView控件,真机samsung S7,1440*2560,测试图片为小图标
放置路径 | 48px*48px | 128px*128px |
---|---|---|
drawable | 4.2 | 5.0 |
drawable-mdpi | 4.2 | 5.0 |
drawable-hdpi | 3.7 | 5.5 |
drawable-xhdpi | 4.3 | 5.3 |
drawable-xxhdpi | 4.3 | 5.1 |
drawable-xxxhdpi | 4.6 | 5.3 |
结论
对于大的图片例如启动界面,引导图片全屏图片,如果不用第三方图片框架加载一定要适配所有的drawable,以后内存溢出怎么死的都不知道。。小图标经笔者不完全测试不会有太大问题,虽然笔者更喜欢用svg,当然当path过于复杂则划不来了。
第二章暂时告一段落,如有错误,敬请指正!
敬畏耶和华是智慧的开端;认识至圣者便是聪明。 (箴言 9:10 和合本)
Android性能优化(第二章)相关推荐
- 《C++应用程序性能优化::第二章C++语言特性的性能分析》学习和理解
<C++应用程序性能优化::第二章C++语言特性的性能分析>学习和理解 说明:<C++应用程序性能优化> 作者:冯宏华等 2007年版.最近出了新版,看了目录,在前面增加了一章 ...
- Android性能优化一篇文章搞定
本文由玉刚说写作平台提供写作赞助,版权归玉刚说微信公众号所有 原作者:Mr.s(猪_队友) 版权声明:未经玉刚说许可,不得以任何形式转载 文章之前的一些话: 本文尿点比较多,酌情看自己想看的. 什么是 ...
- Android性能优化典范第二季
原文链接:http://hukai.me/android-performance-patterns-season-2/ 1)Battery Drain and Networking 对于手机程序,网络 ...
- Android 性能优化 之谈谈Java内存区域
最近一年副业主要在学习投资和技能学习,把以前学习内存分析的一些笔记总结发出来,写了很多笔记总结都没有写完就又忙着了,最近再次总结复习学习一遍,还有提醒各位同学一定要学会投资.. 了解Android 内 ...
- Android 性能优化 之初识Java内存区域
前言 不管是日常开发,还是面试,我们都会和内存打交道,因为内存是支持软件运行的基本硬件环境.了解Android 内存管理,就有必要了解Java GC机制,必须要理解JVM 内存区域,这里我们主 ...
- 史上最全Android性能优化方案解析
Android中的性能优分为以下几个方面: 布局优化 网络优化 安装包优化 内存优化 卡顿优化 启动优化 -- 一.布局优化 布局优化的本质就是减少View的层级.常见的布局优化方案如下: 在Line ...
- Android面试-Android性能优化和内存优化、APP启动速度一线大厂的实战案例解析
一.Android 内存管理机制 二.优化内存的意义 三.避免内存泄漏 四.优化内存空间 五.图片管理模块的设计与实现 六.总结 深入探索Android内存优化 第一章.重识内存优化 第二章.常见工具 ...
- Android 性能优化
为什么80%的码农都做不了架构师?>>> 原文作者:鸿洋 原文地址:点我跳转原文 一般情况下,我们谈性能优化基本上会从以下几个方面: App启动速度优化 UI流畅度优化 内存优 ...
- Android性能优化系列总篇
目前性能优化专题已完成以下部分: 性能优化总纲--性能问题及性能调优方式 性能优化第四篇--移动网络优化 性能优化第三篇--Java(Android)代码优化 性能优化第二篇--布局优化 性能优化第一 ...
- Android主线程耗时动画卡顿,Android性能优化实战之界面卡顿
原标题:Android性能优化实战之界面卡顿 作者:红橙Darren https://www.jianshu.com/p/18bb507d6e62 今天是个奇怪的日子,有三位同学找我,都是关于界面卡顿 ...
最新文章
- ros::spinOnce()机制 有点东西
- QT 调用QWebEngineView显示网页
- vector 源码及使用
- Linux 防火墙的基本认识
- 二、在VMware中搭建PHP集成环境(lamp/lnmp/lanmp)
- 浩鲸科技携手阿里云原生共同打造“场域运营数字化解决方案”
- 微信小程序获取用户唯一openid,包含java
- 值得思考,机器学习模型做出的决策是你想要的吗?
- Linux不仅仅是开源
- 引入对抗训练的对比学习
- 抖音检测注入框架分析
- 小程序 图片上传php后台,微信小程序上传图片到php服务器的方法
- android holder 一定要内部类吗,Android ViewHolder
- Matlab中textscan函数用法
- linewidth方法html,HTML canvas lineWidth用法及代码示例
- 系统崩溃分析 - vmcore 加载到 Trace32
- HBase CURD之Put
- 2022江苏省职业院校技能大赛(中职)网络搭建与应用赛项
- 用瑞利准则研究显微镜物镜的分辨率
- Hudi Clean 清理文件实现分析
热门文章
- ./gradlew :spring-oxm:compileTestJava 执行失败。
- 第11章常用类库学习总结
- 信号完整性的一些概念(2022年6月14日学习笔记)
- 极品婆媳龙争虎斗---留洋归来的女博士(11)
- [Python] cmd中‘py‘命令不被识别的解决方案
- 电子数码商城在线销售系统(asp.net,sqlserver,三层架构)
- 网络直播系统的架构,基础版直播间搭建
- 跟领导关系再好,敬酒时也要说这3句话术,不讨好上司也受重用
- 走出微服务误区:避免从单体到分布式单体
- 如何用动态代理功能实现英雄数据库的添加删除判存以及修改功能?