安卓应用的内存往往是有限的,从开始的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);
} @Override
public 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仍然存在,在进程一系列操作后,仍可以使用开启新进程来降低应用内存

    /**
* 优化内存最后一招-开启新进程
*/
@Override
protected void onDestroy() {
if (mWebView != null) {// remove webView, prevent chromium to crash
ViewParent parent = mWebView.getParent();
if (parent != null) {
((ViewGroup) parent).removeView(mWebView);
}
// 退出时调用此方法,移除绑定的服务,否则某些特定系统会报错
mWebView.getSettings().setJavaScriptEnabled(false);
// 解决Receiver not registered:
// android.widget.ZoomButtonsController
mWebView.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设置图片原理(下)

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丨黑客窃取<权利的游戏>剧本|Android 8.1   本 ...

  3. C语言第十二讲,文件操作.

    C语言第十二讲,文件操作. 一丶文件操作概述 在操作系统中,我们的文档都称为文件.操作系统也为我们提供了接口进行操作.不同语言都是使用的相同的接口,只不过封装的上层接口不一样 操作文件的步骤 打开文件 ...

  4. 十一讲/十二讲 最近总是学不进去,这咋办啊 哭了我i我i我i

    0: 2,9,7      错错错 帽号回来是列表 1:好像一样?   错错错  不一样,list[0]是一个值,冒号回来是个列表 2:A.insert(0,A[-1]) del A[-1]      ...

  5. Android高级之第十一讲Hybird开发

    本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 随着移动端应用平台的兴起,需求和交互方式的多样化,H5开发逐渐在移动端流行起来:常见的移动产品有We ...

  6. Android学习(十二) ContentProvider

    一.ContentProvider简介       当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据.虽然使用其他方法也可以对外共享数据, ...

  7. HTML基础第十二讲---链接标志

    转自:https://i.cnblogs.com/posts?categoryid=1121494 没有链接,WWW将失去存在的意义!WWW之所以受欢迎,乃在于她除了有精美的图文之外,更有方便且多样化 ...

  8. MySQL实战45讲学习笔记:第三十二讲

    一.本节分析案例 在 MySQL 中有两个 kill 命令:一个是 kill query + 线程 id,表示终止这个线程中正在执行的语句:一个是 kill connection + 线程 id,这里 ...

  9. Linux性能优化实战学习笔记:第五十二讲

    一.上节回顾 上一节,我们一起学习了怎么使用动态追踪来观察应用程序和内核的行为.先简单来回顾一下.所谓动态追踪,就是在系统或者应用程序还在正常运行的时候,通过内核中提供的探针,来动态追踪它们的行为,从 ...

随机推荐

  1. whose view is not in the window hierarchy

    参考:http://www.jianshu.com/p/9e90cb866fdf 在做界面跳转的时候,我们经常会用到这两个函数 func dismissViewControllerAnimated(f ...

  2. 根据字符长度动态确定UIlabel宽高

    iOS7中用以下方法 - (CGSize)sizeWithAttributes:(NSDictionary *)attrs; 替代过时的iOS6中的- (CGSize)sizeWithFont:(UI ...

  3. Python爬虫Scrapy框架入门(2)

    本文是跟着大神博客,尝试从网站上爬一堆东西,一堆你懂得的东西 附上原创链接: http://www.cnblogs.com/qiyeboy/p/5428240.html 基本思路是,查看网页元素,填写 ...

  4. SQLite -- 分页查询

    原文:http://blog.csdn.net/lu1024188315/article/details/51734514 参考:http://www.runoob.com/sqlite/sqlite ...

  5. JDK常用工具集——jps

    该命令的作用是罗列出目标系统(target system)中所有具有访问权限到的Java进程. 一.命令简介:     jps [option] [hostid] 二.参数说明:     option ...

  6. redis数据类型之—Set

    (1)set 简单介绍 set集合的数据是不重复的.无序的,一个集合类型键可以存储至多2^32-1 个字符串. (2)set 常用命令

  7. SSM框架整合首只拦路虎——Eclipse新建Maven Project界面select an archetype 空白

    首先给大家说,本篇博客没有技术价值,纯属个人学习总结,权当给大家添加一乐.事件如有雷同,纯属巧合,莫怪! 前一段时间一直在看<淘淘商城>这个教程,里面讲的是SSM框架的一个电商项目.这不是 ...

  8. SQL位移运算函数

    -- ============================================= -- Author:      <maco_wang> -- Create date: & ...

  9. 数据结构之平衡二叉树(AVL树)

    平衡二叉树(AVL树)定义如下:平衡二叉树或者是一棵空树,或者是具有以下性质的二叉排序树: (1)它的左子树和右子树的高度之差绝对值不超过1: (2)它的左子树和右子树都是平衡二叉树. AVL树避免了 ...

  10. android--访问网络权限

    <uses-permission android:name="android.permission.INTERNET"></uses-permission>