避免在循环中使用内存
也可理解为在循环中尽可能少创建对象,自定义控件避免在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的详细描述。

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

  1. Google Developing for Android 三 - Performance最佳实践

    Google Developing for Android 三 - Performance最佳实践 发表于 2015-06-07   |   分类于 Android最佳实践 原文 Developing ...

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

    Google Developing for Android 二 - Memory 最佳实践   |   分类于 Android最佳实践 原文:Developing for Android, II Th ...

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

    前几天在G+上看到Google Developers站点,有一个Android系列的文章,分享到个人微博,周末闲来没事就学写了下,把它们简单的翻译了下,没想到一发不可收拾,六篇文章全部都翻译完了,有些 ...

  4. Android 学习资源

    下面这些资源对Android开发来说是很有帮助的! 最常用的: Android开发官方网站:http://developer.android.com/index.html 这个网站应该是Android ...

  5. Android学习--自己在使用HttpConnection时遇到的EOFException

    在学习第一行代码第14章酷欧天气的时候,HttpUtil类中的sendHttpRequest方法发出请求,然后返回响应信息,但是出现了EOFException异常,代码如下: HttpURLConne ...

  6. Android 学习资料收集

    收集整理这份资料灵感来自于 trip_to_iOS, 征得同意引用了该资料的开头描述 收集整理这份资料主要帮助初学者学习 Android 开发, 希望能快速帮助到他们快速入门, 找到适合自己学习资料, ...

  7. 一、Android学习第一天——环境搭建(转)

    (转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 一. Android学习第一天——环境搭建 Android 开发环境的搭建 ...

  8. [转]Android 学习资料分享(2015 版)

    转 Android 学习资料分享(2015 版) 原文地址:http://www.jianshu.com/p/874ff12a4c01 目录[-] 我是如何自学Android,资料分享(2015 版) ...

  9. Android学习系列(37)--App调试内存泄露之Context篇(下)

    接着<Android学习系列(36)--App调试内存泄露之Context篇(上)>继续分析. 5. AsyncTask对象 我N年前去盛大面过一次试,当时面试官极力推荐我使用AsyncT ...

随机推荐

  1. php笔记(二)PHP类和对象之Static静态关键字

      PHP类和对象之Static静态关键字 静态属性与方法可以在不实例化类的情况下调用,直接使用类名::方法名的方式进行调用.静态属性不允许对象使用->操作符调用. class Car { pr ...

  2. winform窗体对象 单例模式与泛型结合

    实现弹出窗体对象的单例模式  结合泛型后,可以用于所有窗体的弹出操作 public class BaseFrm<T> where T : Form, new() { //定义一个静态的,私 ...

  3. 用DriverBackUp备份了文件 装好系统后怎么把备份的驱动文件还原

    1.打开DriverBackUp 2.菜单栏选择Restore 3.选择open backup file 4.找到备份文件位置,并选择.bki后缀的文件 5.点击"打开" 6.勾选 ...

  4. SSD 和 SAS 意外造 raid 1

    一台机器的磁盘更换后, 一个 SSD 和 一个 SAS 做了 raid 1 , 诡异情况,询问 IDC 同事中. 有可能是打开了 热备.

  5. 为Textview里面的ImageSpan添加点击响应事件

    对于图文混排的TextView,用户在浏览到里面的图片的时候,往往有点击图片preview大图或者preview之后保存图片的需求,这就需要为Textview里面的ImageSpan设置点击响应事件. ...

  6. Eclipse开发中GlassFish 4 重启页面不刷新

    现在项目开发用GlassFish4做服务器,测试了几个web项目出现问题,每次编辑源代码后页面不能按照最新编辑好的代码显示. 一次重新运行web项目在服务器上看到publish,点击后运行的是新编辑的 ...

  7. Docker 安装及问题处理

    1 确定Linux版本 uname -r 2  升级系统(添加 APT 镜像源,添加使用 HTTPS 传输的软件包以及 CA 证书.) sudo apt-get update sudo apt-get ...

  8. FR javascript 时间设置上个月最后一天后当月最后一天

    //设置上月最后一天 var date1 =new Date(); date1.setDate(1); //first day; date1.setMonth(date1.getMonth()); / ...

  9. SDK平台三态按钮的实现

    Windows平台提供了丰富的控件,但是在使用中我们不会使用它提供的默认风格,有时候需要对控件进行改写,让它展现出更友好的一面,这次主要是说明三态按钮的实现. 三态按钮指的是按钮在鼠标移到按钮上时显示 ...

  10. img的问题

    一个div的宽高比和 里面的img的宽高比是一样的 ,div  img { width:100%:height:100%;} img {border:0}   img{ 设置为border:none无 ...