Google Developing for Android 学习总结

避免在循环中使用内存

也可理解为在循环中尽可能少创建对象,自定义控件避免在ondraw里面频繁创建paint对象。

尽可能避免内存分配

对象缓存:

常量通过类级别或者静态来进行缓存。

对象池:

同一种类型的多种对象,考虑使用对象池而不是分配频繁的分配内存。

(不是很理解,还需深入学习)

使用ArrayList.

android集合类:

使用ArrayMap或者simpleArrayMap代替HashMap.

需要修改的方法:

尽可能少用对象类型而是用原始类型的数据,android提供的SparseintArray和SparseLongArray集合类内部使用原始类型而不是对象类型。

使用集合遍历而不使用Iterator进行循环处理,因为使用Iterator会导致Iterator对象的内存分配。如果非要使用,进行非空判断。

避免使用枚举,因为在proguard优化代码和进行代码混淆的时候,枚举会被优化为int值。

针对使用第三方库,如果可能,尽可能抽取里面对自己有用的代码而避免无用的第三方代码。

避免static变量持有Activity的引用,因为这样会导致内存泄漏。

使用ActivityManager.isLowRamDevice()来进行应用的运行时内存限制。

使用IntentService代替service。

对你的应用代码进行瘦身操作。

避免在Application进行初始化操作,代替方法:使用单利来对全局的,公共的数据或者方法进行操作。

避免负责的layout的view层级,可以通过组合控件来将复杂的view布局写成可重用的,层级少的控件,比如titlebar等。

UI Thread减少耗时的操作。建议使用线程池进行DB和Network操作。自定义控件的时候避免在ondraw和onlayout中进行耗时操作。

完事后关闭掉你的Broadcast.避免因为相应过多的intent来影响设备的性能和资源消耗。

网络:

避免过于频繁的网络请求。因为消耗手机的电量和资源。

网络操作放到子线程(一般是线程池)中进行操作。

还要对网络变化的操作进行必要的网络状态检查和判断。

对于网络较差的环境问题的考虑。

网络接口层级别的设计,包括合理的请求和json数据接口。

语言以及库:

使用android自己的库去代替java的库api,比如ArrayMap代替HashMap,sParseArray等。

序列化:我一般写成BaseBean类实现serialize来实现序列化。

文章指出了parcelable序列化的缺点:

将Parcels写入到硬盘中是不安全的

你可以实现自己的Parcelables,但是如果在unparceling(Parcel反序列化)时不能访问到相同到类,那么就会unparcel就失败(对于向framework传递Parcels也适用)。

一些对象被存入到Parcels而不是共享内存中的情况,比如文件描述器,也许是很好的性能优化,但是隐藏了该Parcel对象真实的内存耗费(直到该对象被unparceling反序列化后才会占用真实的内存)。

在android5.0后,PersitableBundle类,可实现Bundle子类的数据的序列化,但是不支持Parcelables。

使用Parcelables ,sqlite,sharedPreferences来避免过度的序列化。

避免JNI,bug难调,多平台编译等缺点。

硬盘存储:
使用Environment.getExternalStorageDirectory() 代替:/sdcard

Context.getDatabasePath(), Context.getFilesDir()代替:/data/data/myapp/databases

持久化相对路径而不是绝对路径,因为路径存在路径存在变化的问题。

临时文件使用Context.getCacheDir()缓存路径。

过于简单的需求尽可能使用sharepreferences来解决而不去使用sqlite去操作。

避免创建过多的db文件,这个在使用ormlite,greendao很少出现这种问题,但是如果按照比较标准的sqlite android写法,有可能在sqliteopenhelper的集成类的创建db的方法中创建多个db文件,因此需要注意。尽量实现多表one db.

架构层:

使用fragement实现部分代码功能,减少service的使用。

避免startservice和bindservice两种对service的操作同时出现在一个逻辑里面。

通过binder传递大对象。

broadcast分发事件,service处理生命周期长的事件。

将UI处理从后台service中抽出来。(比如音频,将播放和视图分开)

有用的接口:

将网络操作的线程池和本地出具存储的线程池分开。确保不相互影响。

对请求和相应数据进行必要的缓存,请求的数据的缓存是为了在网络环境较差的情况下,进行可能的重试操作,而相应的数据是在网络环境差的情况下,避免体验不好的网络数据加载,比如对网络图片的三级缓存和数据的缓存等(数据可以通过orm缓存在数据库,图片利用第三方的piscco和umloader进行图片的缓存,避免不比较的重复加载,减少用户流量的浪费)。

避免异步的耗时操作长期持有view的引用。

适当处理好getApplication和activity的context之间的不同的使用,因为比如dialog的使用,就不能传递getapplication进行界面的显示。

tools:

systrace

allocationTracker

Traceview

Hierarchyviewer

MAT

MemoryMonitor

on-device

srictMode

profile Gpu rendering

debugGpu overdraw

Animator duration scale

adb shell screenrecord /sdcard/myscreenrecord.mp4

Show hardware layer updates

然而我只用过MAT,traceview ,strctMode,其他没怎么用过

文章参考自:http://www.lightskystreet.com/,并加上了自己的部分理解。详细可点击链接,去看lightsky的详细描述。

时间: 2024-11-08 23:07:31

Google Developing for Android 学习总结的相关文章

Google Developing for Android 二 - Memory 最佳实践 // lightSky‘Blog

Google Developing for Android 二 - Memory 最佳实践 |   分类于 Android最佳实践 原文:Developing for Android, II The Rules: Memory 在决定应用的行为,是否有好的用户体验以及整体的设备体验来说,内存的使用可能是独立因素中最重要的.内存因素包括应用的内存占用,以及内存搅动(导致的垃圾回收会对运行期间的性能有影响). 避免在循环中分配内存 内存分配虽然不可避免,但是应尽可能的避免,特别是在平凡的调用的代码块

Google Developing for Android 一 - 相关上下文介绍

前几天在G+上看到Google Developers站点,有一个Android系列的文章,分享到个人微博,周末闲来没事就学写了下,把它们简单的翻译了下,没想到一发不可收拾,六篇文章全部都翻译完了,有些地方省略了部分示例的描述或者换了另一种表述,如果有理解的不准确的地方,还望指正 原文:Developing for Android, I:Understanding the Mobile Context context或者这些建议为何如此重要 对于理解这些最佳实践的相关上下文是非常重要的.特别是明白

Android 学习资料分享(2015 版)

我是如何自学Android,资料分享(2015 版) Tikitoo2015.02.11 10:21 1713 字 3932 次阅读 自己学了两三个月的Android,最近花了一周左右的时间写了个App--Diigoer(已开源),又花了一两周时间找工作,收到了两个Offer,也算是对自己学习的一种认可吧:我刚开始学习总结的--<我是如何自学Android,资料分享>,如果是初学Android 的话,不应该错过的,而今天这篇分享好这篇文章,相对于第一次写的会有所提升,所以建议先把上一篇看了,再

Android 学习笔记 2 Android开发环境的安装(Eclipse Bundle)

搭建eclipse开发环境,一般要经过 安装JDK.安装Eclipse.下载Android SDK.在Eclipse中安装ADT.在Eclipse中配置Android SDK.通过SDK Manager对Android SDK进行管理等几个比较麻烦的步骤. 后来Google推出了 adt-bundle 将ATD.SDK整合到Eclipse中,这样对于新手来说就免去了很多步骤,入门更容易了. 在此推荐一个网站 http://tools.android-studio.org/ 可以免去搬梯子去And

[Android学习系列15]下拉刷新列表实现动态加载

使用google官方的SwipeRefreshLayout 参考: http://blog.csdn.net/easyer2012/article/details/22857807 http://stormzhang.github.io/android/2014/03/29/android-swiperefreshlayout/ http://www.eoeandroid.com/thread-330439-1-1.html http://www.oschina.net/translate/sw

Pro Android学习笔记(十二):了解Intent(下)

解析Intent,寻找匹配Activity 如果给出component名字(包名.类名)是explicit intent,否则是implicit intent.对于explicit intent,关键就是component 名字,在<intent-fliter>中声明的其他属性被忽略.对于implicit intent,则根据action,category和data来进行匹配.然而一个intent fliter中可以声明多个actions,多个categories,多个data属性,因此可以满

Pro Android学习笔记(十):了解Intent(上)

Android引入了Intent的概念来唤起components,component包括:1.Activity(UI元件) 2.Service(后台代码) 3.Broadcast receiver(处理广播消息的代码) 4.Content provider(抽象数据的代码) Intent基本含义 intent是通知平台处理(唤起)的动作.Android唤起的动作将取决于注册了什么动作.例如我们有个简单的Activity:IntentBaiscViewActivity.在AndroidManife

Android学习笔记(四七):Content Provider初谈和Android联系人信息

Content Provider 在数据处理中,Android通常使用Content Provider的方式.Content Provider使用Uri实例作为句柄的数据封装的,很方便地访问地进行数据的增.删.改.查的操作.Android并不提供所有应用共享的数据存储,采用content Provider,提供简单便捷的接口来保持和获取数据,也可以实现跨应用的数据访问.简单地说,Android通过content Provider从数据的封装中获取信息. Content provider使用Uri

Android学习笔记(四五):互联网通信-HttpClient、XML解析(W3C)

前几日Android发布了4.0 Icecream,昨天上网发现Begining Book中有Edition 3的版本,比对一下,还是有相当的改动,不仅仅增加了tablet的部分,对原有的章节有有一些修订,前后的调整等等.先按Edtion 2的顺序看,相同章节的看Edtion 3,然后回头看Edition 3的Chapter 24.25(E2的36).26.27.28.29.44.45.46.47几个新增章节.同时将模拟器改为Android 2.3的版本,已适应可能新增的改动. 访问Intern