Android内存优化

Android性能优化(安卓性能优化)内存泄露 | 内存优化 | UI绘制优化 | 布局优化 | 图片加载 | 多线程优化 | 列表优化 | apk优化 在Android开发中,性能优化是软件开发中最难且也是知识面涉及最深、最广、最难的一个领域,更是开发一款优秀软件的必要条件。更快:App流畅,响应速度快更稳:App运行稳定,程序不崩溃(Crash)也不会无响应(ANR)更省:节省资源,包括电量,内存,存储,流量等。 阅读详情

1.节制的使用Service,最好使用IntentService(任务结束会自动停止,避免Service内存泄漏),只有当任务正在执行的时候才让Service运转起来

2.避免创建不必要的对象(StringBuilder和String)

3.对常量使用static final修饰

4.使用增强型for循环语法(ArrayList除外),传统for循环的第二布尽可能简洁

5.重用布局文件,include,

merge(减少布局嵌套层数),

merge标签可用于两种典型情况:

  • 布局根结点是FrameLayout且不需要设置background或padding等属性,可以用merge代替,因为Activity内容布局的parent view就是个FrameLayout,所以可以用merge消除只剩一个,这一点可以从上图中看到。

  • 某布局作为子布局被其他布局include时,使用merge当作该布局的顶节点,这样在被引入时顶结点会自动被忽略,而将其子节点全部合并到主布局中。

ViewStub,它就是一个占位符,它在布局中不占用空间,自然inflate的时候它也不消耗资源。只有当调用ViewStub的inflate的时候才会用布局替代它,用于提高布局效率,不过使用范围很窄:ViewStub只能被inflate一次,之后就无效了不能再引用它。一般用在onCreate的时候,决定布局里面哪个部分显示,哪个不显示,可以使用ViewStub,并且只能用来Inflate一个布局文件,而不能Inflate某个具体的View。(按需加载,View importPanel = ((ViewStub) findViewById(R.id.stub_import)).inflate();  importPanel.findViewById())
6.Bitmap(内存消耗大户):

在实例化Bitmap的代码中,一定要对OutOfMemory异常进行捕获,出现异常得到一个默认的bitmap图;

缓存通用的Bitmap对象

有时候,可能需要在一个Activity里多次用到同一张图片。比如一个Activity会展示一些用户的头像列表,而如果用户没有设置头像的话,则会显示一个默认头像,而这个头像是位于应用程序本身的资源文件中的。

如果有类似上面的场景,就可以对同一Bitmap进行缓存。如果不进行缓存,尽管看到的是同一张图片文件,但是使用BitmapFactory类的方法来实例化出来的Bitmap,是不同的Bitmap对象。缓存可以避免新建多个Bitmap对象,避免内存的浪费。

 内存缓存(LruCache ,它的主要算法原理是把最近使用的对象用强引用存储在 LinkedHashMap 中,并且把最近最少使用的对象在缓存值达到预设定值之前从内存中移除,在过去,我们经常会使用一种非常流行的内存缓存技术的实现,即软引用或弱引用 (SoftReference or WeakReference)。但是现在已经不再推荐使用这种方式了,因为从 Android 2.3 (API Level 9)开始,垃圾回收器会更倾向于回收持有软引用或弱引用的对象,这让软引用和弱引用变得不再可靠。)另外传入 LruCache 的键值对不能是 null。

Lrucache:LRU即Least Recently Used,近期最少使用算法。也就是当内存缓存达到设定的最大值时将内存缓存中近期最少使用的对象移除,有效的避免了OOM的出现。Lru算法的实现就是通过LinkedHashMap来实现的。LinkedHashMap继承于HashMap,它使用了一个双向链表来存储Map中的Entry顺序关系,这种顺序有两种,一种是LRU顺序,一种是插入顺序LruCache中将LinkedHashMap的顺序设置为LRU顺序来实现LRU缓存,每次调用get(也就是从内存缓存中取图片),则将该对象移到链表的尾端。调用put插入新的对象也是存储在链表尾端,这样当内存缓存达到设定的最大值时,将链表头部的对象(近期最少用到的)移除。

补充:LruMemoryCache代码和v4包的LruCache一样,只是加了一个存储超期的处理


硬盘缓存(DiskLruCache,通常情况下多数应用程序都会将缓存的位置选择为 /sdcard/Android/data/<application package>/cache 这个路径。选择在这个位置有两点好处:第一,这是存储在SD卡上的,因此即使缓存再多的数据也不会对手机的内置存储空间有任何影响,只要SD卡空间足够就行。第二,这个路径被Android系统认定为应用程序的缓存路径,当程序被卸载的时候,这里的数据也会一起被清除掉,这样就不会出现删除程序之后手机上还有很多残留数据的问题。)

DiskLruCache移除缓存:remove()方法中要求传入一个key,然后会删除这个key对应的缓存图片。这个方法我们并不应该经常去调用它。因为你完全不需要担心缓存的数据过多从而占用SD卡太多空间的问题,DiskLruCache会根据我们在调用open()方法时设定的缓存最大值来自动删除多余的缓存。只有你确定某个key对应的缓存内容已经过期,需要从网络获取最新数据的时候才应该调用remove()方法来移除缓存。每当版本号改变,缓存路径下存储的所有数据都会被清除掉,因为DiskLruCache认为当应用程序有版本更新的时候,所有的数据都应该从网上重新获取


图片显示按需加载,图片大小进行缩放(设置inJustDecodeBounds参数和BitmapFactory.Options的采样率),,图图片像素进行处理(RGB_565会比使用ARGB_8888少消耗2倍的内存)片回收(生成Bitmap对象的BitmapFactory的四类方法最终都是在安卓底层实现的,对应着BitmapFactory类的几个native方法,最终都是通过JNI调用方式实现的。所以,加载Bitmap到内存里以后,是包含两部分内存区域的:Bitmap对象存储在Dalvik heap中,而Bitmap对象的像素数据则存储在Native Memory(本地内存),由Java部分分配的,不用的时候系统就会自动回收了,但是那个对应的C可用的内存区域,虚拟机是不能直接回收的,这个只能调用底层的功能释放。最初需要调用recycle()方法来释放C部分的内存,安卓3.0以后,Bitmap的像素数据和Bitmap对象一起存储在Dalvik heap中,系统会自动释放)

补充:BitmapFactory.Options.inBitmap的这个字段,假如这个字段被设置了,我们在解码Bitmap的时候,他会去重用inBitmap设置的Bitmap,减少内存的分配和释放,提高了应用的性能

7.避免内部调用get,set(字段搜寻比方法调用效率高)

8.减少APK大小

9.能用基本类型如Int,Long,就不用Integer,Long对象,基本类型变量占用的内存资源比相应对象占用的少得多

10.避免内存泄漏     

Android内存泄露抓取工具leakcanary (leakcanry在application中配置,它通过弱引用方式侦查Activity或对象的生命周期,若发现内存泄露得到泄露的最短路径,最后通过notification展示。)        

-非静态内部类的静态实例容易造成内存泄漏(1.将内部类变成静态内部类 2.如果有强引用Activity中的属性,则将该属性的引用方式改为弱引用。3.在业务允许的情况下,当Activity执行onDestory时,结束这些耗时任务。)

-activity使用静态成员,单例模式,静态变量持有activity的context的引用(不使用的时候显示设置为null或者持有applicationcontext的引用)

-bitmap的回收

-使用handler时的内存问题(onDestroy时清除消息,mHandler.removeCallbacksAndMessages(null);handler设为静态内部类,并设置为对activity的弱引用)

-注册某个对象后未反注册

-集合中对象没清理造成的内存泄露

-资源对象没关闭造成的内存泄露

-构造Adapter时,没有使用缓存的 convertView

-兜底回收 在Activity onDestory时候从view的rootview开始,递归释放所有子view涉及的图片,背景,DrawingCache,监听器等等资源,让Activity成为一个不占资源的空壳,泄露了也不会导致图片资源被持有。


补充:绝大多数情况下,硬件加速可以解决莫名的卡顿问题,设置android:hardwareAccelerated="true"可为activity开启硬件加速



Windows10下RTABMAP+T265实现三维建图 win10+rtabmap+t265扫描地形 阅读详情

相关推荐

GPU运维工程师入门指南 (第九篇): 高性能网络 - InfiniBand与RDMA技术

本文介绍了支撑AI分布式训练的高性能网络技术InfiniBand和RDMA。传统TCP/IP网络因内核开销和内存拷贝成为性能瓶颈,而InfiniBand提供高带宽、低延迟的专用网络,RDMA则通过内核旁路和零拷贝技术实现节点间内存直接访问,显著提升通信效率。特别介绍了GPUDirect RDMA技术,使GPU显存可直接通信。文章还列举了运维人员在部署这些技术时需要考虑的硬件、驱动、配置和监控等关键点。这些技术共同构成了支撑大规模AI集群的"数据高速公路",为后续讨论存储性能瓶颈奠定了基础

weixin_42587823的博客 1096

android释放acitity内存,安卓内存优化

为什么要进行内存优化安卓应用如果不进行内存优化,一些不良的代码习惯或编码可能有内存泄漏,甚至导致OOM。这样的应用随着长时间的使用,经常会出现越来越卡的现象,严重的甚至会直接闪退,进而给用户带来劣质感,严重影响用户体验和使用,最终导致用户流失。对于你的手机,都有自己的app内存配置参数,可以adb查看adb shell getprop | findstr heap显示[dalvik.vm.heap...

weixin_39748838的博客 554

CloudCompare

分割点云:选中要分割的点云文件–>Segment–>左键框出要分割的点或者区域–>Segment Out–>Comfirm Segmentation,原点云文件被分割成两个结构,选中分割出来的remaining,右键delete即可。qSRA (Surface of Revolution Analysis):计算一个点云和一个假定旋转平面之间的距离(旋转平面用2D轮廓定义),距离计算好后,用户可以创建一个偏差的2D图或者圆柱或圆锥的投影。②表现为同样的对象或者至少有同样的形状。

xiaoyaolangwj的博客 4709

安卓内存优化参数详情

这些内存页是进程独占的,并且已经被修改过,因此不能被其他进程共享。1. Pss Total (Proportional Set Size): 进程独占的内存 + (共享内存 / 映射次数),进程使用的内存量,按比例分配共享内存。* Heap Size 是进程分配的堆内存总量,其中 Heap Alloc 是已经使用的部分,Heap Free 是尚未使用的部分。2. 关联: SwapPss Dirty 是 PSS 的一部分,但它表示的是已经被交换到磁盘上的内存。1. 这是进程私有的脏页内存量。

Hunter_chemistry的博客 878

Paypal开发者中心获取“ClientId”和“ClientSecret”参数

正式环境设置 1、登录到 paypal开发者中心 网址:https://developer.paypal.com/developer/ 点击右上角登录按钮登录 2、左侧栏 - 我的应用程序和凭证 - 点击“创建新应用” 新注册的paypal账号,需要进行邮箱验证,验证通过后,需要等待一段时间(或重新登录),才会出现相关设置项位置 验证邮箱通过后,点击创建新应用 3、按提示填写,保存创建应用 4、点击刚创建的应用进入应用详情页 5、应用详情页获得网站开发人员所需要的“ClientId”和“Client

龚清林的博客 1万+

Ansys Zemax与Speos协同设计:HUD系统从光学优化到驾驶视觉验证全流程解析

本文详细解析了如何利用Ansys Zemax与Speos协同工作流,完成HUD系统从光学内核优化到驾驶视觉验证的全流程。通过Zemax进行精密光学设计与像差校正,再通过Speos进行HOA定量分析和虚拟驾驶舱仿真,实现了数据无损流转与验证闭环,有效解决了光学性能与视觉感知脱节的核心问题,显著提升HUD设计效率与可靠性。

git9versioner的博客 527

安卓内存优化

文章目录为什么要进行内存优化优化步骤1,查看当前的应用内存使用情况,发现是否有内存泄漏2,内存泄漏点查找,并解决问题3,其它一些日常项目中编码的注意点 为什么要进行内存优化 安卓应用如果不进行内存优化,一些不良的代码习惯或编码可能有内存泄漏,甚至导致OOM。这样的应用随着长时间的使用,经常会出现越来越卡的现象,严重的甚至会直接闪退,进而给用户带来劣质感,严重影响用户体验和使用,最终导致用户流失。 对于你的手机,都有自己的app内存配置参数,可以adb查看 adb shell getprop | findst

weixin_41605683的博客 2634

SAP S/4HANA Cloud 管理员业务角色创建实战:基于 SAP_BR_ADMINISTRATOR 模板的一站式指南

摘要:SAP S/4HANA Cloud新系统初始登录时常见Fiori Launchpad无磁贴的问题,这是由于缺乏合适的业务角色分配。本文介绍了通过预交付的SAP_BR_ADMINISTRATOR模板创建管理员角色的完整流程,包括业务用户、业务角色和业务目录的核心概念解析。重点说明了直接使用模板的风险,并提供了从模板创建自定义管理员角色的详细步骤(4.1-4.3),以及权限限制设置的注意事项。文中还分享了一个实际项目案例,强调正确配置管理员角色对后续权限体系建设的关键作用。(149字)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 200

Android 内存优化

一、重识内存优化 Android给每个应用进程分配的内存都是非常有限的,那么,为什么不能把图片下载下来都放到磁盘中呢?那是因为放在 内存 中,展示会更 “快”,快的原因有两点,如下所示: 1)、硬件快:内存本身读取、存入速度快。 2)、复用快:解码成果有效保存,复用时,直接使用解码后对象,而不是再做一次图像解码。 这里说一下解码的概念。Android系统要在屏幕上展示图片的时候只认 “像素缓冲”,而这也是大多数操作系统的特征。而我们 常见的jpg,png等图片格式,都是把 “像素缓冲” 使用不同的手段

十年代码写十年 2743

【高级强化学习:算法、优化与泛化】第13章 扩散模型策略优化(Diffusion Policy Optimization)

\quad$ 计算均值 $\mu_t = \frac{1}{\sqrt{\alpha_t}} \left( x_t - \frac{1 - \alpha_t}{\sqrt{1 - \bar{\alpha}_t}} \tilde{\epsilon} \right)$.$\quad$ 组合得分估计: $\tilde{\epsilon} = \epsilon_{\text{unc}} + w \cdot (\epsilon_{\text{con}} - \epsilon_{\text{unc}})$.

u012133341的博客 337

YOLO11多个点组合创新:GC10-DET缺陷检测 | DCNv4结合SPPF+11Detect创新性结合

DCNv4结合SPPF+11Detect创新性结合,原始mAP50为0.633 提升至0.651

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 1287

APP怎么判断自己是处于前台还是后台

两张方法 通过RunningTaskInfo类判断(需要额外权限) 需要在AndroidMenitfest.xml文件中添加以下权限 <uses-permission android:name="android.permission.GET_TASKS" /> public static boolean isApplicationBroughtToBackground(final Con

天行九歌 6310

基于STM32L4XX 、HAL库的ATD5984步进电机驱动器驱动程序应用设计

一、简介: ATD5984是一款内部集成了译码器的微特步进电机 驱动器,能使双极步进电机以全、半、1/4、/1/8、1/16 和1/32步进模式工作。步进模式由逻辑输入管脚MSx选 择。其输出驱动能力达到28V±1.6A。 译码器是ATD5984易于使用的关键,通过STEP管脚 输入一个脉冲就可以使电机完成一次步进,省去了相序 表,高频控制线及复杂的编程接口,使其更适于没有复 杂的微处理器或微处理器负担过重的场合。 在步进操作期间,ATD5984的内部电路可以自动

PP_Cottage的博客 404

Android的activity启动延迟加载

我们有时会遇到白屏或者页面切换卡顿等现象,这些都是Activity启动速度慢的表现.我们一般有两种优化方式,软优化和硬优化.硬优化主要是针对代码的结构和逻辑,如精简布局,减少层次使用include,merge,viewStub;能用基本类型如Int,Long,就不用Integer,Long对象等.软优化尽可能减少代码的结构和逻辑,下面我们主要来看软优化的延迟加载.    延迟加载是把可以延迟展示

天行九歌 4665

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Android恶意样本批量获取方法

在进行Android恶意软件检测的研究时,不可避免地需要大批量的Android恶意样本,但在获取的时候会遇到一些困难,下面介绍几种方法:1.国内论坛 看雪论坛 http://bbs.pediy.com/ 木蚂蚁社区http://bbs.mumayi.net/卡饭论坛http://www.kafan.cn/kf.php吾爱破解http://www.52pojie.cn/这些都是三三两两上传,吾爱

天行九歌 3876

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

PID,UID,sharedUserId以及Android开启多进程模式

linux下的UID是系统用户名的意思,Android系统修改了linux 的UID的含义:每个APP对应一个UID。通过设置ShareUID,拥有同一个ShareUID并且签名相同的两个APP可以跑在同一个进程中;PID是进程id的意思,一个UID可以对应多个PID 包名和签名: 包名不一致:系统会认为是个新的软件,这就不算升级了 包名一致,签名不一致:系统会提示先卸载之前安装的版本,才能继续

天行九歌 3508

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

关于OnTrimMemory

OnTrimMemory 回调是 Android 4.0 之后提供的一个API,这个 API 是提供给开发者的,它的主要作用是提示开发者在系统内存不足的时候,通过处理部分资源来释放内存,从而避免被 Android 系统杀死。这样应用在下一次启动的时候,速度就会比较快。 本文通过问答的方式,从各个方面来讲解 OnTrimMemory 回调的使用过程和效果。想要开发高性能且用户体验良好的 Androi

天行九歌 3055

Android和Java的垃圾回收

来讨论一下Android的GC操作,GC全称是Garbage Collection,也就是所谓的垃圾回收。Android系统会在适当的时机触发GC操作,一旦进行GC操作,就会将一些不再使用的对象进行回收。那么哪些对象会被认为是不再使用,并且可以被回收的呢?我们来看下面一张图: 上图当中,每个蓝色的圆圈就代表一个内存当中的对象,而圆圈之间的箭头就是它们的引用关系。这些对象有些是处于活动状态

天行九歌 3037

Android静态/动态注册广播的区别

广播接收器注册一共有两种形式 : 静态注册和动态注册. 两者及其接收广播的区别: 1.动态注册广播不是常驻型广播,也就是说广播跟随activity的生命周期。注意: 在activity结束前,移除广播接收器。 静态注册是常驻型,也就是说当应用程序关闭后,如果有信息广播来,程序也会被系统调用自动运行。2.当广播为有序广播时: 1 优先级高的先接收 2

天行九歌 2806

Android屏幕卡顿,电量损耗和Service常驻小结

一、屏幕出现卡顿的原因: 表面原因: 1、在UI主线程中执行比如像网络下载等耗时的操作,致使CPU没有能力在16ms内完成对下一帧显示数据的处理 2、需要显示的界面太过复杂,比如布局的层次较深,界面控件过多等,给CPU与GPU的渲染造成压力 3、手机硬件GPU、CPU处理能力有限,FPS低于16ms,造成卡顿;Android 4.1后Triple Buffering三缓冲机制一定程度上缓解了

天行九歌 1942

JVM和DVM

区别一:dvm执行的是.dex格式文件 jvm执行的是.class文件 Android程序编译完之后生产.class文件,然后,dex工具会把.class文件处理成.dex文件,然后把资源文件和.dex文件等打包成.apk文件。apk就是android package的意思。 jvm执行的是.class文件。 区别二:dvm是基于寄存器的虚拟机 而jvm执行是基于虚拟栈的虚拟机。寄存器存取

天行九歌 1189

Activity和Service的启动

相同app: standard:新启动的activity位于栈顶 singleTop:如果调用的目标Activity已经位于调用者的Task的栈顶,则不创建新实例,而是使用当前的这个Activity实例,并调用这个实例的onNewIntent方法。 singleTask:如果实例存在所有位于该activity上面的activity实例会被销毁 singleInstance:新启动的acti

天行九歌 1085

Android存储数据的几种方式

Android一共五种存储方式: 1.文件存储 2.SharedPreference存储 3.使用SQLite存储 4.使用ContentProvider存储 5.网络存储 文件存储  保存在/data/data/packagename/files目录下,读取/写入的方式,文件可用来存放大量数据,如文本、图片、音频等。 SharedPreference存储  保存在/data/data

天行九歌 895

Android的Binder小结

Server?????Server????Service?????????Client?????????Service Manager??????SM???????????Server???SM?????????? Client?????Client??Service????????????????SM???????????Client???????????? ?Client?

天行九歌 869

Android的硬件加速

手机中的GPU也是为了对图形、图像处理而存在的,所谓强制渲染,就是hwa(hard ware acceleration硬件加速)的一种,其存在的意义就是为了分担CPU的负担,其原理是通过GPU对软件图形图像的处理来减轻CPU的负担,从而使应用软件能够以更快的速度被处理,以达到提速的目的。对于普通的玩家来说,强制GPU渲染是一把双刃剑,有利有弊。虽然强制GPU渲染能够实现应用软件的提速,不过长期的开启

天行九歌 827

Android的Fragment

Fragment的生命周期不废话,直接上图 fragment所在的 Activity 的生命周期会影响fragment的生命周期,其表现为,Activity 的每次生命周期回调都会引发每个片段的类似回调。 例如,当 Activity 收到 onPause() 时,Activity 中的每个片段也会收到 onPause()。不过,fragment还有几个额外的生命周期回调,用于处理与 Activ

天行九歌 778
下一篇: Activity和Service的启动
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值