• 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.尽量采用静态内部类,这样可以避免潜在的由于内部类而导致的内存泄露

  • 相关阅读:
    Ionic2开发环境搭建
    关于在浏览器中测试cordova plugin的注意事项。
    像azure一样桌面显示Windows系统信息
    吐槽下微软
    Hyper-v UBUNTU 12.04 模板设置
    MongoDB整库备份与还原以及单个collection备份、恢复方法
    nginx 配置
    vsftpd配置文件详解
    分享几个免费IP地址查询接口(API)
    黑客帝国效果
  • 原文地址:https://www.cnblogs.com/xiaoxiaing/p/5886048.html
Copyright © 2020-2023  润新知