你会经常遇见的android性能优化方面知识总结

2024-05-29 22:32

本文主要是介绍你会经常遇见的android性能优化方面知识总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

你会经常遇见的android性能优化方面知识总结https://blog.csdn.net/Coo123_/article/details/87367131项目源码
目录
布局优化
绘制优化
内存泄漏优化
ListView和Bitmap优化
布局优化
减少布局文件的层级
删除布局中无用的控件和布局
尽量使用简单高效的ViewGroup,比如FrameLayout和LinaerLayout
可以使用include标签复用布局,使用merge标签减少层级
include、merge标签案例
在layout文件中创建layout/incloude_merge_memory.xml文件内容如下:
    <merge xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
        <TextView
            android:id="@+id/mTV_incloud_merge"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@android:color/holo_red_light"
            android:gravity="center"
            android:padding="5dp"
            android:text="这是一个include的merge" />
    </merge>

在Activity的layout布局引入:
    <include layout="@layout/incloude_merge_memory" />
ViewStub
它是一个轻量级的布局宽度、高度只有0,不参与绘制过程。
按需加载,不占用空间。
当显示ViewStub中的布局时候,ViewStub会被替换掉,并且会被从布局中移除。
xml代码:
    <ViewStub
        android:id="@+id/mVS_layoutMemory"
        android:layout_width="match_parent"
        android:layout_height="80dp"
        android:background="@android:color/holo_blue_bright"
        android:inflatedId="@id/mRL_viewStubMemory"
        android:layout="@layout/viewsutub_memory"
        android:padding="10dp" />

上面代码中id为mVS_layoutMemory为ViewStub的id,而inflatedId是引入布局 @layout/viewsutub_memory跟布局的id。需要注意的是ViewStub中layout布局是不支持merge标签的,接下来看一下java代码的调用:
    mVS_layoutMemory = findViewById(R.id.mVS_layoutMemory);
    mVS_layoutMemory.setVisibility(View.VISIBLE);

绘制优化
不要在onDraw中创建新的布局对象
不要在onDraw中做大量的耗时操作
内存泄漏优化
静态变量引起的泄漏
单例模式引起的泄漏
非静态内部类持有外部引用导致的泄漏
Handler引起的内存泄漏
属性动画引起的泄漏
静态变量导致的内存泄漏
这种情况常见的是Context的使用,比如我们写了一个工具类,里面的静态方法需要用到Context。如果我们将Activity的this传给这个方法,那么Activity在被回收的时候由于这个静态变量持有Activity的引用,导致不能被回收从而引起内存泄漏。
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_layoyt_memory);
      AppUtil.getTesLeak(this);
    }
    
    public static void getTesLeak(Context context) {
        Toast.makeText(context, "您的内存泄漏啦", Toast.LENGTH_SHORT).show();
    }

解决上面的问题也很多简单,如果我们的工具类不是一定需要Activity的Context,难么我们可以考虑使用getApplicationContext()。因为 getApplicationContext() 是和我们App的生命周期一样长,如果App不退出他就不会被回收。
单例模式导致的内存泄漏
单例引起的内存泄漏,大概思路上面差不多,也是因为静态变量的生命周期太长,如果程序不退出,系统就不会对其回收,这将导致本应该不用的对象不能回收,我们可以指定Context为getApplicationContext();来避免内存泄漏。
    public class MemorySingle {
        //如果传入上下文
        private static Context context;
        private MemorySingle() {
        }
    
        public static MemorySingle getInstance(Context context) {
            //防止内存泄漏
            MemorySingle.context = context.getApplicationContext();
            return Menory.single;
        }
        
        static class Menory {
            private static final MemorySingle single = new MemorySingle();
        }
    }

非静态内部类持有外部引用引起的泄漏
因为非静态内部类的生命周期是和外部类的生命周期绑定在一起的,非静态内部类会持有外部类的引用,如果我们在内部类中做一些耗时操作,如下面内部类sleepThread()方法让线程睡10秒,在这个时候如果Activy要销毁,但是因为内部类持有外部类的引用,它的sleepThread()方法还没执行完,所以导致Activy不能被回收,引起内存泄漏。
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_layoyt_memory);
        TestLeak testLeak = new TestLeak();
        testLeak.sleepThread();
    }
     class TestLeak {
        private void sleepThread() {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        //睡10秒
                        Thread.sleep(10000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }).start();
        }
    }

解决方法将TestLeak改成静态内部类
    static class TestLeak {
        private void sleepThread() {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        //睡10秒
                        Thread.sleep(10000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }).start();
        }

Handler引起的内存泄漏
我们使用Handler做消息处理的时候可能不注意会用下面这种写法:
    private Handler mHanlder = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case 200:
                    mTV_incloud_merge.setText((String) msg.obj);
                    break;
            }
            super.handleMessage(msg);
        }
    };

上面的mHanlder是Handler的非静态匿名内部类,上面我们提到过非静态匿名内部类会持有外部引用,所以如果使用上面的写法也会引起内存泄漏。下面有两种方式可以避免泄漏。
第一种方式: 使用静态内部类+弱引用方式
    static class MyHanlder extends Handler {
        //弱引用
        WeakReference<Activity> mWeakRef;
        public MyHanlder(Activity activity) {
            mWeakRef = new WeakReference<>(activity);
        }
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what) {
                case 200:
                    LayoutMemoryActivity activity = (LayoutMemoryActivity) mWeakRef.get();
                    activity.mTV_incloud_merge.setText((String) msg.obj);
                    break;
            }
        }
    }

第二种: Handler.Callback方式处理消息
Handler mHandler = new Handler(new Handler.Callback() {
    @Override
    public boolean handleMessage(Message msg) {
        switch (msg.what) {
            case 200:
                mTV_incloud_merge.setText((String) msg.obj);
                break;
        }
        return false;
    }
})

复制代码属性动画导致的内存泄漏
当一个Activy中有一个无限循环的属性动画,在Activy销毁的时候没有停止动画也会引起内存泄漏
     ObjectAnimator oA = ObjectAnimator.ofFloat(mBnt_layoutMemory, "rotation", 0, 360).setDuration(20000);
                   oA.start();
1
2
上面的是一个按钮选装动画,20秒后执行完,如果在动画还为执行完的时候销毁Activy,将会导致Activy无法释放引起内存泄漏。下面是解决办法
    @Override
    protected void onDestroy() {
        super.onDestroy();
        //取消动画
        oAnimator.cancel();
    }

ListView和Bitmap优化
ListView优化
ListView的优化是一个很长见的问题,主要是通过ViewHolder实现对item的复用,这里不做过多的解释了。在这我推荐一篇文章感兴趣的可以看看,下面有一个例子:
    @Override
    public View getView(final int position, View convertView,        ViewGroup parent) {
        MyHolder myHolder = null;
        //判断是否有缓存布局
        if (convertView == null) {
            convertView =LayoutInflater.from(context).inflate(android.R.layout.simple_list_item_1, null);
            myHolder = new MyHolder(convertView);
            convertView.setTag(position);
        } else {
            //得到缓存布局
            myHolder = (MyHolder) convertView.getTag();
        }
        myHolder.mTV_test1.setText(textContent);
    }          
    class MyHolder {
        TextView mTV_test1;
    
        MyHolder(View view) {
            mTV_test1 = view.findViewById(android.R.id.text1);
        }
    }

Bitmap优化
我们大部分图片处理是使用glide、‘picasso’,这些框架在图片加载速度和性能优化方面已经很好了,但有些特殊情况可能需要我们自己实现图片的处理,主要注意下面几个方面。
对图片进行压缩
缓存策略
图片不使用的时候要记得释放
总结
android的性能优化需要了解的方面还有很多比如电量的优化、包大小、启动速度的优化等等,上面列出的只是一部分常见的问题和解决办法。在开发过程中需要优化的放要远比上面写道的多,还需要我们自己多积累经验和结合实际考虑来优化。
免费获取安卓开发架构的资料(包括Fultter、高级UI、性能优化、架构师课程、 NDK、Kotlin、混合式开发(ReactNative+Weex)和一线互联网公司关于android面试的题目汇总可以加:936332305 / 链接:点击链接加入【安卓开发架构】:

分享资料:

链   接 : https://pan.baidu.com/s/1ihwAYjeMbq1RInmNKeRxqw

提取码: wwsc

  • 2020年脑机接口即将落地.pdf
  • 2030年科幻落地的前夜:人类如何应对机器觉醒.pdf
  • 3D深度视觉产业链全解读 TOF技术或成黑马.pdf
  • 5G技术将如何影响全球经济.pdf
  • AI三板斧_智东西出品.pdf
  • AI产业链解读:老美家大财厚 中国如何才能后发先至.pdf
  • AR红包技术层面全解读 引爆场景营销.pdf
  • CB Insights发布独角兽英雄榜 揭秘资本寒冬下的生存法则.pdf
  • CB Insights起底VC八杰 谁在做独角兽的幕后推手.pdf
  • CB Insight发布创业百强榜单 AI成功案例最强盘点.pdf
  • GfK 2017一季度VR零售市场报告 全面解读产业盈利模式.pdf
  • GFK中国VR零售市场调研报告 平价设备成主力军.pdf
  • GSMA移动经济发展态势全解读 亚太+5G成未来钥匙.pdf
  • IBM全面解读认知计算:IoT和AI并非全部 行业已经开始盈利.pdf
  • IDC:机器人3.0时代开启 细分市场兹待爆发.pdf
  • 联合国:2017全球投资报告.pdf
  • VR市场现状调研:启动期资金才是王道 2C应用五年内难有突破.pdf
  • VR开发者报告:不炒作!我们正经做生意.pdf
  • WEF 2017全球风险报告当平缓的经济撞上技术爆炸.pdf
  • 中国互联网单车租赁市场专题分析 资本驱动下的圈地战.pdf
  • 互联网迎来AI 时代,海外科技巨头争先布局.pdf
  • 产业链视角:怎样设计一款全面屏手机.pdf
  • 人工智能和工业4.0进行时 机器人创企50强都有谁?.pdf
  • 从苹果ARkit看AR未来的黄金五年.pdf
  • 企业AI转型价值详解:百亿资本催化的数字鸿沟.pdf
  • 企业数字化落地加速 下一波机遇在哪里?.pdf
  • 信通院物联网产业深度报告 平台化和数据服务即将爆发.pdf
  • 刘强东马云正面杠 新零售时代智慧物流平台战打响.pdf
  • 创业公司尸检报告:盈利模式错误 融资失败成致命打击.pdf
  • 剧透高通9150 C-V2X.pdf
  • 区块链+IPO靠谱吗?解密首次代币众筹的逻辑与隐忧.pdf
  • 区块链创投热潮力推技术转化 构建价值互联网.pdf
  • 千亿级智能安防市场解读:设备和技术都已经准备好了.pdf
  • 华为VR大数据:全面解读2C市场突破口和技术门槛.pdf
  • 国内AI技术发展快 资本寒冬不难挨.pdf
  • 埃森哲解读5G智慧城市 GDP狂增5000亿美元.pdf
  • 如何抓准新能源汽车蓝海的目标用户.pdf
  • 学院派发达国家是如何制定AI发展计划的?.pdf
  • 已有12+飞行器研发公司 NASA联手FAA推进航空商业化.pdf
  • 德勤技术趋势全面盘点:企业如何搭上现代化快车.pdf
  • 德勤物联网工业全解读:从“后知后觉”到“先见之明”.pdf
  • 战略解读:库克为何入局智能音箱.pdf
  • 截至2030年技术爆发点全面预测 3D打印和人工智能火力全开.pdf
  • 捷孚凯3C市场报告:手机大卖电脑回血消费走向中高端.pdf
  • 摩根大通智能汽车百亿市场深度调研 看23家中国零部件制造商如何突围.pdf
  • 数字时代北京深圳创业最强 川渝地区或成第四极经济圈.pdf
  • 数据大象流对网络架构发起挑战 MR才是产业的未来 .pdf
  • 新能源后补贴时代 自主品牌的“野化”路.pdf
  • 新能源浪潮的第二大风口:电能存储.pdf
  • 无人机基站——应急通信新方案.pdf
  • 普华永道全球科技行业IPO回顾 独角兽缺席导致的冷场.pdf
  • 普华永道蓝皮书 全面盘点中国汽车市场新常态.pdf
  • 普华永道:15.7万亿美元AI市场的八大入口.pdf
  • 新能源后补贴时代 自主品牌的“野化”路.pdf
  • 智慧医疗是如何成为AI规模最大,增长最快的领域的?.pdf
  • 智能传感器:未来机器的感官 百亿美元的市场.pdf
  • 智能语音生态盘点:科技巨头战略布局 两大场景率先爆发.pdf
  • 智能音箱市场分析:为什么大家都在抢这个两亿小蛋糕?.pdf
  • 毕马威17Q1风投报告:正常化下的VC生存法则.pdf
  • 毕马威电子商务深度调研:中国成手机端网购大户 引领社交平台的品牌宣传.pdf
  • 毕马威颠覆性技术调研 841名高管共寻突破.pdf
  • 毕马威:20个痛点对策看懂金融科技.pdf
  • 深度学习成最大爆点 巨头们如何构建AI生态.pdf
  • 深度解读白宫58页AI白皮书:全面盘点技术、产业和战略.pdf
  • 深度:从供需革命看智能手机的七大发展趋势.pdf
  • 特斯拉现有及Model3潜在国产产业链梳理.pdf
  • 电子消费市场总值缩水又怎样 17年移动互联和可穿戴照样赚个盆满钵.pdf
  • 白宫再推人工智能白皮书 技术过渡期应如何应对工种转型.pdf
  • 突围新零售电商时代:移动为先 社交互动.pdf
  • 维度提升 AR 开启视觉入口时代.pdf
  • 美国信息技术产业委员会:14条人工智能政策准则.pdf
  • 联合国点名表扬:中国数字支付生态系统是如何实现领先的.pdf
  • 致企业管理者:下一场工业革命的十大原则.pdf
  • 解密:NB-IoT商用元年的背后推手都有谁?.pdf
  • 让李彦宏梭哈的AI+医疗有何神通 产业链报告解读万亿市场.pdf
  • 诚实回答:AI产业界现在,究竟在做啥?.pdf
  • 谈谈你们都在怕的国内AI人才缺口.pdf
  • 谷歌壕无人性收购史:14家公司,260.5亿美元.pdf
  • 谷歌自曝无人驾驶核心技术!700亿估值Waymo炼成之谜.pdf
  • 软银世界大会:一文读懂孙正义眼中的不久和将来.pdf
  • 量子计算创业盘点:无敌是多么寂寞.pdf
  • 阿里云服务战略解读:马云如何布张新零售包围圈.pdf
  • 高盛史上最全面AI产业盘点 深度解析背后技术.pdf
  • 麦肯锡中国市场调研:AI是科技板块的狂欢 传统行业的两难.pdf
  • 麦肯锡市场深度观察:如何电动汽车的销售和盈利.pdf
  • 麦肯锡深度解读中国AI路的三座大山预言五大战略重点.pdf

 

这篇关于你会经常遇见的android性能优化方面知识总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1014808

相关文章

Vue3 的 shallowRef 和 shallowReactive:优化性能

大家对 Vue3 的 ref 和 reactive 都很熟悉,那么对 shallowRef 和 shallowReactive 是否了解呢? 在编程和数据结构中,“shallow”(浅层)通常指对数据结构的最外层进行操作,而不递归地处理其内部或嵌套的数据。这种处理方式关注的是数据结构的第一层属性或元素,而忽略更深层次的嵌套内容。 1. 浅层与深层的对比 1.1 浅层(Shallow) 定义

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

性能测试介绍

性能测试是一种测试方法,旨在评估系统、应用程序或组件在现实场景中的性能表现和可靠性。它通常用于衡量系统在不同负载条件下的响应时间、吞吐量、资源利用率、稳定性和可扩展性等关键指标。 为什么要进行性能测试 通过性能测试,可以确定系统是否能够满足预期的性能要求,找出性能瓶颈和潜在的问题,并进行优化和调整。 发现性能瓶颈:性能测试可以帮助发现系统的性能瓶颈,即系统在高负载或高并发情况下可能出现的问题

HDFS—存储优化(纠删码)

纠删码原理 HDFS 默认情况下,一个文件有3个副本,这样提高了数据的可靠性,但也带来了2倍的冗余开销。 Hadoop3.x 引入了纠删码,采用计算的方式,可以节省约50%左右的存储空间。 此种方式节约了空间,但是会增加 cpu 的计算。 纠删码策略是给具体一个路径设置。所有往此路径下存储的文件,都会执行此策略。 默认只开启对 RS-6-3-1024k

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

sqlite3 相关知识

WAL 模式 VS 回滚模式 特性WAL 模式回滚模式(Rollback Journal)定义使用写前日志来记录变更。使用回滚日志来记录事务的所有修改。特点更高的并发性和性能;支持多读者和单写者。支持安全的事务回滚,但并发性较低。性能写入性能更好,尤其是读多写少的场景。写操作会造成较大的性能开销,尤其是在事务开始时。写入流程数据首先写入 WAL 文件,然后才从 WAL 刷新到主数据库。数据在开始

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo