将来深入技术收藏Android

android开发 之 优化篇

2016-09-12  本文已影响696人  诺之林

本文的思维导图(这里使用的是MindNode)

android-interview-questions-06-advanced.png

目录

内存优化

尽量避免使用枚举

相比基本数据类型, 枚举占用的内存更多, 因此, Android官方也建议避免使用枚举

Enums often require more than twice as much memory as static constants. You should strictly avoid using enums on Android.

更多参考Managing Your App's Memory

使用SparseArray,ArrayMap代替HashMap

SparseArray ArrayMap
场景 替代Key为基本数据类型的HashMap 替代Key为Object数据类型的HashMap
目的 减少内存占用 减少内存占用
优点 节约内存 / No auto-boxing 节约内存
缺点: 大数据量时效率低 / 只在android可用 大数据量时效率低 / 只在android可用

更多参考Android Memories by Romain Guy / SparseArray vs HashMap / android use ArrayMap SparseArray instead of HashMap

使用Parcelable序列化

Serializable Parcelable
特点 实现简单但效率较低 效率更高但实现比较麻烦(推荐插件Android Parcelable Code Generator)
原理 依赖反射, 同时产生大量临时对象会依赖GC 过程完全由自己实现和控制
范围 Java项目中都可用 只在android可用

在使用Intent传递数据时, 尽量使用Parcelable做序列化, 尤其当数据是Object类型时

详细参考PARCELABLE VS. JAVA SERIALIZATION IN ANDROID APP DEVELOPMENT

Bitmap

详细参考Android 开发绕不过的坑:你的 Bitmap 究竟占多大内存 / Android 高清加载巨图方案 拒绝压缩图片

合理使用多进程

例如将Music Player分成两个独立的进程: UI + Play Service, 这样UI进程的资源就可以在Music Player后台长时间播放时释放

虽然这样的场景下, 可以降低内存占用, 但是通常情况下新的进程是会带来更多的内存开销的, 所以多进程的内存优化方式需要谨慎使用

性能优化

Layout

WebView缓存

if (NetStatusUtil.isConnected(getApplicationContext())) {
    webSettings.setCacheMode(WebSettings.LOAD_DEFAULT); //根据cache-control决定是否从网络上取数据。
} else {
    webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); //没网,则从本地获取,即离线加载
}

详细参考Android开发:最全面、最易懂的Webview详解

使用Parcelable序列化

同上, 详细参考: 内存优化 - 使用Parcelable序列化

Bitmap

详细参考LruCache

合理使用多线程

理论上, 除了UI操作以外的其他任何操作都是可以放在子线程中的

Android多线程详细参考android学习 之 Service

但是, 我们也并不鼓励"滥用"多线程, 因为

更多参考Performance Tips

打包优化

图片格式

常见图片格式的文件大小: png > jpg > webp, 但实际开发中主要还是使用png, 这是因为

ios-png.png

更多参考PNG compression and iOS apps

图片其他

总之: 在开发过程中, 尽量少尽量小地引入图片

ProGuard

更多参考Android Proguard(混淆) / ProGuard详解

在线化

精简

更多参考Android APP终极瘦身指南

小结

由于经验和眼界有限, 本文肯定会有很多遗漏和错误, 欢迎大家留言和补充

附录

更多文章, 请支持我的个人博客

上一篇 下一篇

猜你喜欢

热点阅读