Android为TV端助力 布局、绘制、内存泄露、响应速度、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为TV端助力 布局、绘制、内存泄露、响应速度、listview和bitmap、线程优化以及一些优化的建议!的更多相关文章
- Android为TV端助力 转载:内存泄露与内存溢出的区别
内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory:比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出. ...
- Android为TV端助力 内存溢出与内存泄露
内存溢出就是软件运行需要的内存,超出了java虚拟机给他分配的可用的最大内存 内存泄露就是在缓存图片文字等等的时候,没有关闭流所导致的内存泄露
- Android为TV端助力listview 非常重要的几个属性
首先是stackFromBottom属性,这只该属性之后你做好的列表就会显示你列表的最下面,值为true和false Android:stackFromBottom="true" ...
- Android为TV端助力 双缓存机制
废话不多说,直接贴代码! 所谓的双缓存,第一就是缓存在内存里面,第二就是缓存在SD卡里面,当你需要加载数据时,先去内存缓存中查找,如果没有再去SD卡中查找,并且用户可以自选使用哪种缓存! 缓存内存和缓 ...
- Android为TV端助力(转载)
作者地址http://www.jianshu.com/u/63915ef020e2 针对Android Tv的自定义RecyclerView 作者 wenju_song 关注 2016.12.09 1 ...
- Android为TV端助力 ViewTreeObserver(转载)
Android ViewTreeObserver简介 一.结构 public final class ViewTreeObserver extends Object java.lang.Objec ...
- Android为TV端助力 转载:Android绘图Canvas十八般武器之Shader详解及实战篇(上)
前言 Android中绘图离不开的就是Canvas了,Canvas是一个庞大的知识体系,有Java层的,也有jni层深入到Framework.Canvas有许多的知识内容,构建了一个武器库一般,所谓十 ...
- Android为TV端助力 关于Fragment你所需知道的一切!
转载自刘明渊 的博客地址:http://blog.csdn.net/vanpersie_9987 Fragment 是 Android API 中的一个类,它代表Activity中的一部分界面:您可以 ...
- Android为TV端助力 转载自jguangyou的博客,XML基本属性大全
android:layout_width 指定组件布局宽度 android:layout_height 指定组件布局高度 android:alpha 设置组件透明度 android:backgroun ...
随机推荐
- insert update delete 语法 以及用法
insert update delete 被称为 数据定义语句语句 也就是数据的增加 修改 删除 其中不包括查询 譬如: create database -创建数据库 alter database - ...
- 【PHP篇】变量与常量
变量: 变量的作用域为函数区域 判断是否存在:isset($变量名)://返回bool 判断是否为空:empty($变量名)//变量未声明或者值为空返回1,否则返回false 清除变量:unset($ ...
- axios的秘密
vue自2.0开始,vue-resource不再作为官方推荐的ajax方案,转而推荐使用axios. 按照作者的原话来说: “Ajax 本身跟 Vue 并没有什么需要特别整合的地方,使用 fetch ...
- java多线程(2)---生命周期、线程通讯
java生命周期.线程通讯 一.生命周期 有关线程生命周期就要看下面这张图,围绕这张图讲解它的方法的含义,和不同方法间的区别. 1.yield()方法 yield()让当前正在运行的线程回到就绪 ...
- 原生端与服务器通过sessionid实现session共享以及登录验证
注:原生端与服务器建立连接时产生的sessionid会变,跟上一次的不一样,为了保证sessionid一样,所以第一次服务器需要把sessionid返回给原生端,下一次与服务端会话时,原生端需要把这个 ...
- Linux编程 24 shell编程(结构化 if [ condition ] 数值比较,字符串比较)
一.概述 接着上篇讲的结构化命令,最后讲到了test命令的另一种写法 if [ condition ],它的语法格式如下: --格式如下: if [ condition ] then commands ...
- Leetcode 1-10
这篇文章介绍Leetcode1到10题的解决思路和相关代码. 1. Two sum 问题描述:给定一个整数数组,返回两个数字的索引,使它们加起来等于一个特定的目标. 例子: Given nums = ...
- SpingBoot 属性加载
属性加载顺序 配置属性加载的顺序 开发者工具 `Devtools` 全局配置参数: 单元测试上的 `@TestPropertySource` 注解指定的参数: 单元测试上的 `@SpringBootT ...
- leetcode — spiral-matrix-ii
import java.util.ArrayList; import java.util.Arrays; import java.util.List; /** * Source : https://o ...
- SpringBoot(11) SpringBoot自定义拦截器
自定义拦截器共两步:第一:注册.第二:定义拦截器. 一.注册 @Configuration 继承WebMvcConfigurationAdapter(SpringBoot2.X之前旧版本) 旧版本代码 ...