避免在循环中使用内存
也可理解为在循环中尽可能少创建对象,自定义控件避免在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. centos6.5 安装ansible,管理多台服务器

    安装python(最低2.6v) (1).python2.7安装 wget https://www.python.org/ftp/python/2.7.8/Python-2.7.8.tgz # tar ...

  2. ViewPagerIndicator的使用方法

    使用方法:   1.引用library,并解决support v4 jar包冲突   2.布局文件中添加viewpager和viewpagerindicator,布局文件: <LinearLay ...

  3. The Key to final data

    // FinalData.java - (insert one line description here) package com.hp.ci.mgmt.perm.hal.localization; ...

  4. 学会Nodejs 的require和exports

    NodeJs中模块的导入和导出,是最基本的概念,但是看了之后,心里还是有一些疑惑的地方,比如: 1.有两个文件:part.js 和 main.js,main.js中要想使用part.js中定义的变量和 ...

  5. 关于单选按钮在提交时获取所选择的选项得value值问题

    在此使用jQuery,别忘记引用. radio在使用时若要判断选中的是哪一个一定要注意区分input的name值.以此来判断你所获取的单选按钮的value值.直接上代码: <body> & ...

  6. python生产者消费者模型

    业界用的比较广泛,多线程之间进行同步数据的方法,解决线程之间堵塞,互相不影响. server --> 生产者 client --> 消费者 在一个程序中实现又有生产者又有消费者 ,生产者不 ...

  7. Mybatis(一)

     jdbc开发 1)优点:简单易学,上手快,非常灵活构建SQL,效率高 2)缺点:代码繁琐,难以写出高质量的代码(例如:资源的释放,SQL注入安全性等) 开发者既要写业务逻辑,又要写对象的创建和销毁, ...

  8. The most orzed and orzing man

    The most orzed and orzing man 题目链接:http://acm.xidian.edu.cn/problem.php?id=1184 Sprague-Grundy定理:htt ...

  9. git切换分支

    今天同事问我她的报错了,我看了一下,是分支没有指向远程仓库对应的分支;报错如下; $ git pull There is no tracking information for the current ...

  10. 关于js优化和css优化

    css优化: 1.css代码的压缩. 2.css文件的合并. 3.不滥用float,因为float在渲染时计算量比较大,所以尽量减少使用float. 4.避免在html标签中写style属性. js优 ...