安卓应用的内存往往是有限的,从开始的8M到16M,24M,32M,48M,64M等逐步变大,但内存的变大是由于分辨率的提高导致,并不意味着可以随意声明使用内存,而不及时回收(即使Java有自己的垃圾回收机制,但内存过高会引起应用变卡,体验流畅性下降)。

降低应用内存消耗的办法有以下几种常见办法:

1、图片声明使用的context使用Application,回收时清除ImageView的drawable

2、使用viewStub占位,避免经常使用gone方法,减少对象的加载和初始化

3、使用merge把能合并的布局统统合并,在hierachyviewer里面可以看到布局的复杂度

4、去掉decorView和window的背景,往往由于应用有自身的色调搭配

5、通过canvas的clip方法,避免在看不到的地方画图,通过quickReject方法来在确定的区域比如矩形内绘制,

跳过非既定区域内绘制

6、使用9path文件和自定义图片,以及透明背景,来防止过度绘制

7、列表可以给定一个高度(根据item的高度来动态设置),来防止重复计算高度和执行布局方法

8、合理选择组件,选择简单的而非复杂的组件(原因,如果你自定义过复杂组件自己就会明白)

9、开启新进程作为服务进程和工具进程-最大招,有效降低当前应用的内存消耗

避免内存泄露的几个办法:

1、及时清除对象或回调引用的context,降低引用链长度

    /*** 清除页面的ImageView的引用链* @param view*/public static void unbindDrawables(View view) {if (view.getBackground() != null) {view.getBackground().setCallback(null);}if (view instanceof ViewGroup) {for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {unbindDrawables(((ViewGroup) view).getChildAt(i));}((ViewGroup) view).removeAllViews();}}

2、Bitmap用前根据屏幕dpi或自定义要求进行压缩,过后及时回收

3、Cursor对象及时关闭,避免对数据库对象的长期引用

4、关键地方做空判断,页面关闭时及时回收对象

5、context尽量使用application,避免页面关闭时,由于引用存在而不能及时回收对象

6、避免在for循环中声明对象(一下子无数个对象产生,内存暴增),引用能写在外面最好,如array.length,直接用

int size获取值,再遍历

7、打开开发者模式中的CPU绘制选项,根据屏幕显示的红黄蓝来辨别页面的绘制情况

8、handler往往引用context,使用弱引用的方式处理

    public WeakHandler handler = new WeakHandler(this);public class WeakHandler extends Handler {WeakReference<Context> mContextWeakReference;public WeakHandler(Context context) {mContextWeakReference = new WeakReference<Context>(context);}@Overridepublic void handleMessage(Message msg) {if (mContextWeakReference.get() == null || msg == null) {return;}boolean handled = !handleMessageDelegate(msg.what, msg.obj);if (handled) {if (msg.what < 0) {handleErrorMessage(msg);} else {handlePtrMessage(msg);}}}}

9、一般webView也会有内存泄露的问题出现,往往由于引用未删除,自身的view仍然存在,在进程一系列操作后,仍可以使用开启新进程来降低应用内存

    /*** 优化内存最后一招-开启新进程*/@Overrideprotected void onDestroy() {if (mWebView != null) {// remove webView, prevent chromium to crashViewParent parent = mWebView.getParent();if (parent != null) {((ViewGroup) parent).removeView(mWebView);}// 退出时调用此方法,移除绑定的服务,否则某些特定系统会报错mWebView.getSettings().setJavaScriptEnabled(false);// 解决Receiver not registered:// android.widget.ZoomButtonsControllermWebView.setVisibility(View.GONE);mWebView.removeAllViews();mWebView.clearCache(false);mWebView.stopLoading();mWebView.destroy();mWebView = null;setConfigCallback(null);}super.onDestroy();}/*** 删除引用* @param windowManager*/public void setConfigCallback(WindowManager windowManager) {try {Field field = WebView.class.getDeclaredField("mWebViewCore");field = field.getType().getDeclaredField("mBrowserFrame");field = field.getType().getDeclaredField("sConfigCallback");field.setAccessible(true);Object configCallback = field.get(null);if (null == configCallback) {return;}field = field.getType().getDeclaredField("mWindowManager");field.setAccessible(true);field.set(configCallback, windowManager);} catch(Exception e) {}}

检查内存泄露的工具有:Lint(inspect code-performance)、Mat(case gc-分析hprof文件)、LeakMemory(Log日志弹窗)、As自带(Monitor-Dump Java Heap),更多介绍

图片更多:Android ImageView设置图片原理(下)

转载于:https://www.cnblogs.com/fengju/p/6174375.html

Android高级之十二讲之如何降低应用内存消耗相关推荐

  1. CG基础教程-陈惟老师十二讲笔记

    转自 麽洋TinyOcean:http://www.douban.com/people/Tinyocean/notes?start=50&type=note 因为看了陈惟十二讲视频没有课件,边 ...

  2. 【阿里聚安全·安全周刊】阿里双11技术十二讲直播预约|AWS S3配置错误曝光NSA陆军机密文件

    原文链接:点击打开链接 摘要: 关键词:阿里双11技术十二讲直播丨雪人计划丨亚马逊AWS S3配置错误丨2018威胁预测丨MacOS漏洞丨智能风控平台MTEE3丨黑客窃取<权利的游戏>剧本 ...

  3. 【阿里聚安全·安全周刊】阿里双11技术十二讲直播预约|AWS S3配置错误曝光NSA陆军机密文件...

    关键词:阿里双11技术十二讲直播丨雪人计划丨亚马逊AWS S3配置错误丨2018威胁预测丨MacOS漏洞丨智能风控平台MTEE3丨黑客窃取<权利的游戏>剧本|Android 8.1   本 ...

  4. C++面向对象高级编程十九讲

    文章目录 0 背景 1 内容 0 背景 因为本人的C++基础不是很扎实,很多面向对象的基本语法掌握的不是很熟练,导致写程序出错时,经常会犯错,于是就去网上找到了侯捷老师的C++课进行观摩学习. 本文是 ...

  5. 【预告:直播回顾资料下载】2017阿里巴巴双11技术十二讲,历数双11精彩技术干货

    点击有惊喜 历届双11,阿里以其前瞻性的视角和创新技术一直致力于为大众递交诚意满满的答卷,大浪淘沙后最终沉淀下来的都是技术的烁金.叹为观止的数字中流转着这样的人.故事和技术,想要详细了解2017阿里双 ...

  6. 深入Android系统(十二)Android图形显示系统-2-SurfaceFlinger与图像输出

    最近有些忙,切实体验了一把拖更的羞耻感 ( *︾▽︾) 本文和上一篇深入Android系统(十二)Android图形显示系统-1-显示原理与Surface关系比较密切,撸完前篇更易理解本文啦 (๑‾ ...

  7. 高翔博士SLAMBOO2十二讲代码库中的三方库没有下载下来 ,需要手动对三方库单独下载的git的命令如下

    高翔博士SLAMBOO2十二讲代码库中的三方库没有下载下来 git clone --recursive https://github.com/gaoxiang12/slambook2.git 需要手动 ...

  8. 趣谈网络协议笔记-二(第十二讲)

    趣谈网络协议笔记-二(第十二讲) TCP协议(下):西行必定多妖孽,恒心智慧消磨难 前言 哈哈哈,越当我看刘超的通俗讲解,我就越感觉自己的无能.每次当我看了讲解之后,每次当我感觉到这个东西原来是这么简 ...

  9. 服务器系统报错kernel-power,第十二讲、Linux服务器操作系统1.ppt

    第十二讲.Linux服务器操作系统1.ppt 4.1引导与关闭系统 4.1.1 GRUB引导器 GRUB简介 1)grub?是一个多重启动管理器.grub是GRand?Unified?Bootload ...

最新文章

  1. diff与patch命令
  2. 【干货】专注用户体验,用最小代价验证你想法的可执行性
  3. 杭电1003 java_杭电ACM1003题怎么理解?
  4. 关于计算机考试网上操作的题目及答案,《计算机基础考试题及答案》.doc
  5. 遇到一个把.o文件strip后出现的奇怪问题
  6. 关于static 和 const
  7. javascript 动画效果(多物体缓冲运动,多物体透明度变化,匀速移入移出、链式运动、同时运动)
  8. 机器人学重点知识点总结
  9. HTML网页设计原理是什么,HTML+CSS网页设计详解
  10. 整人的bat文件代码
  11. 职业规划 软件开发职业规划的10个建议
  12. 致远OA—V5版本系统预置用户密码恢复方法
  13. discuzX1.5制作单页教程
  14. 前端导出多页pdf 带目录 页眉 页脚及页码
  15. 够快联想坚果云这三个产品哪个更好
  16. 什么叫侧链_什么是侧链基团?
  17. 解决nginx报错: [warn] conflicting server name “localhost“ on 0.0.0.0:80, ignored
  18. 手机服务器缓存在什么位置,手机服务器缓存设置方法
  19. jsp标签jsp:useBean用法
  20. STM8时钟树及电源管理

热门文章

  1. hash签名 java_java开发区块链只需150行代码
  2. redis mysql 雪崩_Redis缓存雪崩、缓存穿透、并发等5大难题,你有没有解决方案
  3. 社区发现(六)--模块度
  4. 人脸对齐(二十一)--A Recurrent Encoder-Decoder Network for Sequential Face Alignment
  5. 垃圾回收GC经典算法
  6. html密码至少输入6位,JS实现六位字符密码输入器功能
  7. 使用pip安装tensorflow很慢的问题
  8. HTTP请求报头中各个字段的含义
  9. 云栖科技评论世界杯特刊:俄罗斯世界杯,新技术再一次升级内容产业
  10. 背水一战 Windows 10 (42) - 控件(导航类): Frame 动画