android:布局、绘制、内存泄露、响应速度、listview和bitmap、线程优化以及一些优化的建议!
1.布局优化
首先删除布局中无用的控件和层级,其次有选择地使用性能较低的viewgroup,比如布局中既可以使用RelativeLayout和LinearLayout,那我们就采用LinearLayout,因为RelativeLayout的功能比较复杂,它的布局需要花费
风度哦的CPU实际。
布局优化的另一个手段就是采用<include>,<merge>,<viewstub>标签。<include>主要用于布局重用,<include>,<merge>标签一般配合使用,他可以减少布局的层级,而<viewstub>泽提供了按需加载的功能,需要
时才会将<viewstub>中的布局加载到内存。这提高了程序的初始化效率。下面介绍下他们的使用方法。
<include> :在你的根布局里面添加<include layout="@layout/main_portals" />就行,然后main_portals布局里
<merge xmlns:android="http://schemas.android.com/apk/res/android"
       xmlns:hyhotel="http://schemas.android.com/apk/res/com.hysmarthotel.movie" >
//自己按需求添加view
</merge>
注意<include>标签只支持android:layout开头的属性,比如android:layout_width,android:layout_height其他属性是不支持的如 android:background,android:id是个特例,如果指定了该属性,同时被包含的布局也指定
了ID,那么以这个ID为主。如果指定了android:layout_*这种属性,那么android:layout_width,android:layout_height就必须存在,否则其他的android:layout_*将无效
<viewstub>:使用方法
<ViewStub
        android:id="@+id/hotkey_view_stub"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout="@layout/hotkey_view_layout" />
在你当前的布局里面添加viewstub,hotkey_view_layout为你需要用到此布局时的名称,在activity如果要用到这个布局时,有两种方法加载,当ViewStub被加载时,ViewStub就会被它内部的布局替换掉,这个时候ViewStub就不
再是整个布局的一部分了,而且ViewStub不支持<merge>标签
(ViewStub)findViewById(R.id.hotkey_view_stub).setVisibility(View,visibie); 或者
ViewStub viewStub = (ViewStub)findViewById(R.id.hotkey_view_stub).inflate();
2.绘制优化!
绘制优化是指view的onDraw方法要避免执行大量的操作,这主要体现在两个方面。
首先,ondraw中不要创建新的局部变量,这是因为onDraw方法可能会被频繁的调用,这样就会在一瞬间产生大量的临时对象,这不仅占用了过多的内存还会导致系统更加频繁的gc,降低了程序的执行效率
另一方面,onDraw方法中不要做耗时的操作,,也不能执行成千上万的循环操作,景每次循环都是轻量级的,但是大量的循环仍然十分抢占CPU的时间片,这会造成view的绘制过程不流畅,按照google官方给出的性能优化典范中的标准
,view的绘制帧率保证60fps是最佳的,这就要求每帧的绘制时间不超过16ms(16ms = 1000/60),虽然程序很难保证60fps这个时间,但是尽量降低onDraw方法的复杂度总是切实有效的。
3.内存泄露优化!

还有在属性动画,handler发送循环消息,单例模式等我们都应该在activity,OnDestory之前取消动画或者删除handler消息序列。
4.响应速度优化!
响应速度的优化的核心思想就是避免在主线程中做耗时的操作,避免出现ANR现象
5.ListView和Bitmap优化。
listview优化主要分为三个方面:首先要采用ViewHolder并避免在getview中执行耗时操作;其次是根据列表的滑动状态来控制任务的执行频率,也就是说当用户用手指不断的滑动时,我们不去加载图片,因为这种一瞬间会造成上百条数据加载,
如果我们在getview里面是异步加载,那一瞬间也会产生上百条异步任务,造成非常大的资源浪费;最后可以尝试开启硬件加速来使listview的滑动更加流畅,硬件加速如下。

Bitmap的优化注意是通过BitmapFactory.Options来根据需要对图片进行采样,采样过程主用用到BitmapFactory.Options的inSampleSize,如下:
/**
	 * 
	 * @param resources getResources()
	 * @param resId  资源图片的ID
	 * @param reqWidth 控件imageview的宽
	 * @param reaHeight 控件imageview的高
	 */
	public Bitmap showImageView(Resources resources,int resId,int reqWidth,int reaHeight){
		BitmapFactory.Options options = new BitmapFactory.Options();
		options.inJustDecodeBounds = true;
		BitmapFactory.decodeResource(resources,  resId, options);
		int w = options.outWidth;//获得实际图片的宽和高
		int h = options.outHeight;
		int inSampleSize = 1;
		if(w>reqWidth || h>reaHeight){
			int halfH = w / 2;//取实际图片的宽和高的一半用来跟imageview的宽度进行对比
			int halfW = h / 2;
			/**
			 * 如果实际图片宽度/高度的一半还大于imageview的宽度/高度,那么就把图片采用率inSampleSize设置为2的倍数
			 * 图片采用率为2表示采样后的图片宽高均为原图大小的1/2,而像素数为原图的1/4,内存大小也为原图的1/4
			 */
			while ((halfW/inSampleSize)>=w&&(halfH/inSampleSize)>=h) {
				inSampleSize*=2;
			}
		}
		options.inSampleSize = inSampleSize;
		options.inJustDecodeBounds = false;
		return	BitmapFactory.decodeResource(resources, resId, options);
	}
6.线程优化!
线程优化的思想是采用线程池,避免存在大量的Thread。线程池可以重用内部的线程,从而避免了线程的创建和销毁所带来的性能开销,同时小成成还能有效的控制线程池的最大并发数,避免大量的线程因互相抢占系统资源
从而导致阻塞现象的发生。
7.一些性能优化建议!
1.避免创建过多的对象。
2.不要过多使用枚举,枚举占用的内存空间比整数型大
3.常量请使用static final 来修饰
4.使用一些Android特有的数据结构,比如SparseArray和Pair等,他们都具有更好的性能
5.适当使用软引用和弱引用
6.采用内存缓存和磁盘缓存
7.尽量采用静态内部类,这样可以避免潜在的由于内部类而导致的内存泄露
android:布局、绘制、内存泄露、响应速度、listview和bitmap、线程优化以及一些优化的建议!的更多相关文章
- 查找并修复Android中的内存泄露—OutOfMemoryError
		
[编者按]本文作者为来自南非约翰内斯堡的女程序员 Rebecca Franks,Rebecca 热衷于安卓开发,拥有4年安卓应用开发经验.有点完美主义者,喜爱美食. 本文系国内ITOM管理平台 One ...
 - Android DDMS检测内存泄露
		
Android DDMS检测内存泄露 DDMS是Android开发包中自带工具,可以测试app性能,用于发现内存问题. 1.环境搭建 参考之前发的Android测试环境搭建相关文章,这里不再复述: 2 ...
 - LeakCanary  Android 和 Java 内存泄露检测
		
说起内存泄漏还是挺让人头疼的,而且不是每个手机都会发生的情况,往往又不易察觉,那么今天我们就来介绍下LeakCanary这个工具 githup:https://github.com/square/le ...
 - 如何快速排查解决Android中的内存泄露问题
		
概述 内存泄露是Android开发中比较常见的问题,一旦发生会导致大量内存空间得不到释放,可用内存急剧减少,导致运行卡顿,部分功能不可用甚至引发应用crash.对于复杂度比较高.多人协同开发的项目来讲 ...
 - 使用新版Android Studio检测内存泄露和性能
		
内存泄露,是Android开发者最头疼的事.可能一处小小的内存泄露,都可能是毁于千里之堤的蚁穴. 怎么才能检测内存泄露呢?网上教程非常多,不过很多都是使用Eclipse检测的, 其实1.3版本以后的 ...
 - Android开发——避免内存泄露
		
本文翻译自Avoiding memory leak——Post by Romain Guy 著作权归原作者所有.转载请注明出处,由JohnTsai翻译 Android应用被分配的堆的大小限制为16MB ...
 - Android Handler的内存泄露问题+解决方案
		
谈谈handler的内存泄露问题 再来看看我们的新建Handler的代码: private Handler mHandler = new Handler() { @Override public vo ...
 - Android Studio检测内存泄露和性能
		
韩梦飞沙 yue31313 韩亚飞 han_meng_fei_sha 313134555@qq.com 首先需要明白一个概念, 内存泄露就是指,本应该回收的内存,还驻留在内存中. 一般情况下,高密度的 ...
 - Android内存优化8 内存检测工具2 LeakCanary——直白的展现Android中的内存泄露
		
之前碰到的OOM问题,终于很直白的呈现在我的眼前:我尝试了MAT,但是发现不怎么会用.直到今天终于发现了这个新工具: 当我们的App中存在内存泄露时会在通知栏弹出通知: 当点击该通知时,会跳转到具体的 ...
 - LeakCanary——直白的展现Android中的内存泄露
		
之前碰到的OOM问题,终于很直白的呈现在我的眼前:我尝试了MAT,但是发现不怎么会用.直到今天终于发现了这个新工具: 当我们的App中存在内存泄露时会在通知栏弹出通知: 当点击该通知时,会跳转到具体的 ...
 
随机推荐
- css 垂直水平居中总结
			
一.前言: 垂直居中有很多方式,我们要做的不是写出完美代码,而是在合适的情况下根据需求选择合适方式. 主要方式: line-height 绝对定位 表格 display:table-cell 主要需求 ...
 - 关于php语言的使用!
			
------php语言与JavaScript的使用 方法是相似 <script type="text/javascript"> </script>--js与 ...
 - Atitit smb网络邻居原理与实现查询列表
			
Atitit smb网络邻居原理与实现查询列表 1.1. SAMBA的起源1 1.2. Smb是否依赖unpn SSDP ,还是使用扫描遍历0-255发现原理1 2. SMB共享不成功原因分享(WI ...
 - php 查询
			
<h1>租房信息</h1> <?php $db = ","asdadads"); $tj = "1=1"; $tj1 = ...
 - Android笔记——Bundle类的作用
			
Bundle类用作携带数据,它类似于Map,用于存放key-value键值对形式的值.相对于Map,它提供了各种常用类型的putXxx()/getXxx()方法,如:putString()/getSt ...
 - Python TODO
			
参数类型和用法 所有的双划线方法以及特性 类的构建过程 实例的构建过程 元类MetaClass 装饰器 描述符 迭代器 上下文管理器 生成器 lambda 数据结构,集合 垃圾回收机制 类方法,静态方 ...
 - Vuex2.0+Vue2.0构建备忘录应用实践
			
一.介绍Vuex Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化,适合于构建中大型单页应用. ...
 - MVC视图展现模式之移动布局解析-续集
			
网站就必须用响应式布局吗?MVC视图展现模式之移动布局:http://www.cnblogs.com/dunitian/p/5213787.html demo:http://pan.baidu.com ...
 - PHP 面向对象编程和设计模式 (3/5) - 单例模式和工厂模式
			
PHP高级程序设计 学习笔记 2014.06.11 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容 ...
 - Web中的XHRHttpRequest
			
1.提出者:Jesse James Garrett 2.IE中,XHR是通过ActiveX对象实现的.涉及浏览器的兼容性写法. 3.使用 <1>open("请求方式&qu ...