[Android随笔]内存优化纪录篇
2015-08-05 21:40
567 查看
一些常见的MemoryLeak分析,平时自己代码中也注意使用。
1,大量的使用static关键字修饰
static是个好东西,声明赋值调用就是那么的简单方便,但是伴随而来的还有性能问题。由于static声明变量的生命周期其实是和APP的生命周期一样的,有点类似与Application。如果大量的使用的话,就会占据内存空间不释放,积少成多也会造成内存的不断开销,直至挂掉。static的合理使用一般用来修饰基本数据类型或者轻量级对象,尽量避免修复集合或者大对象,常用作修饰全局配置项、工具类方法、内部类。
2,Bitmap的使用
2.1 Bitmap处理不当极可能造成OOM,绝大多数情况应用程序OOM都是因这个原因出现的。Bitmap在被创建使用后,由于Dalivk并不会主动的去回收,需要开发者在Bitmap不被使用的时候recycle掉。
2.2 同时还有种情况则是加载大图片,如果需求允许,可以对图片进行一定的缩放,通过BitmapFactory.Options的inSampleSize属性控制。
2.3 使用LruCache内存缓存以及DiskLruCache硬盘缓存方法来加载和显示图片。
2.4 使用android-universal-imageLoader或者xUtils第三方开源库。
后期个人分析篇《Android基础》
3,Cursor及时关闭
在查询SQLite数据库时,会返回一个Cursor,当查询完毕后,调用cursor.close()及时关闭,这样就可以把查询结果集及时给回收掉。
4,I/O流
I/O流操作完毕,读写结束,及时关闭。
5,ListView和GridView的Item的缓存
在ListView和GridView中,列表中的很多项(convertView)是可以重用的,不需要每次getView就重新生成一项。另外,页面的绘制其实是很耗时的,findViewById也比较慢。所以不重用View,在有列表的时候就尤为显著了,经常会出现滑动很卡的现象。
可以参考《ViewHolder的用法》示例代码如下:
6,String、StringBuilder、StringBuffer
当有较多的字符串需要拼接操作的时候,使用StringBuilder或者StringBuffer,如果不考虑线性安全的情况下,推荐使用String Builder。
7,Handler清理
在处理异步操作的时候,handler + thread是个不错的选择。但是相信在使用handler的时候,大家都会遇到警告的情形,这个就是lint为开发者的提醒。handler运行于UI线程,不断处理来自MessageQueue的消息,如果handler还有消息需要处理但是Activity页面已经结束的情况下,Activity的引用其实并不会被回收,这就造成了内存泄漏。解决方案,一是在Activity的onDestroy方法中调用handler.removeCallbacksAndMessages(null);取消所有的消息的处理,包括待处理的消息;
8,页面背景图
在布局和代码中设置背景和图片的时候,如果是纯色,尽量使用color;如果是规则图形,尽量使用shape画图;如果稍微复杂点,可以使用9patch图;如果不能使用9patch的情况下,针对几种主流分辨率的机型进行切图。如果ImageView的背景图是会变化的,则在布局文件xml中不添加android.src=""属性,而是在代码中设置背景资源图。
1,大量的使用static关键字修饰
static是个好东西,声明赋值调用就是那么的简单方便,但是伴随而来的还有性能问题。由于static声明变量的生命周期其实是和APP的生命周期一样的,有点类似与Application。如果大量的使用的话,就会占据内存空间不释放,积少成多也会造成内存的不断开销,直至挂掉。static的合理使用一般用来修饰基本数据类型或者轻量级对象,尽量避免修复集合或者大对象,常用作修饰全局配置项、工具类方法、内部类。
2,Bitmap的使用
2.1 Bitmap处理不当极可能造成OOM,绝大多数情况应用程序OOM都是因这个原因出现的。Bitmap在被创建使用后,由于Dalivk并不会主动的去回收,需要开发者在Bitmap不被使用的时候recycle掉。
2.2 同时还有种情况则是加载大图片,如果需求允许,可以对图片进行一定的缩放,通过BitmapFactory.Options的inSampleSize属性控制。
2.3 使用LruCache内存缓存以及DiskLruCache硬盘缓存方法来加载和显示图片。
2.4 使用android-universal-imageLoader或者xUtils第三方开源库。
后期个人分析篇《Android基础》
3,Cursor及时关闭
在查询SQLite数据库时,会返回一个Cursor,当查询完毕后,调用cursor.close()及时关闭,这样就可以把查询结果集及时给回收掉。
4,I/O流
I/O流操作完毕,读写结束,及时关闭。
5,ListView和GridView的Item的缓存
在ListView和GridView中,列表中的很多项(convertView)是可以重用的,不需要每次getView就重新生成一项。另外,页面的绘制其实是很耗时的,findViewById也比较慢。所以不重用View,在有列表的时候就尤为显著了,经常会出现滑动很卡的现象。
可以参考《ViewHolder的用法》示例代码如下:
public class FileListAdapter extends BaseAdapter{ private final Context mContext; private final ArrayList<String> mList; public FileListAdapter(Context context, ArrayList<String> list) { mContext = context; mList = list; } @Override public int getCount() { return mList.size(); } @Override public Object getItem(int position) { return mList.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder = null; if (convertView == null){ holder = new ViewHolder(); LayoutInflater inflater = LayoutInflater.from(mContext); convertView = inflater.inflate(R.layout.list_item, null); holder.imagView = (ImageView)convertView.findViewById(R.id.imageView); holder.textView = (TextView)convertView.findViewById(R.id.textView); convertView.setTag(holder); }else { holder = (ViewHolder) convertView.getTag(); } holder.imagView.setBackgroundResource(R.mipmap.ic_launcher); holder.textView.setText(mList.get(position)); return convertView; } class ViewHolder { public ImageView imagView; public TextView textView; } }
6,String、StringBuilder、StringBuffer
当有较多的字符串需要拼接操作的时候,使用StringBuilder或者StringBuffer,如果不考虑线性安全的情况下,推荐使用String Builder。
7,Handler清理
在处理异步操作的时候,handler + thread是个不错的选择。但是相信在使用handler的时候,大家都会遇到警告的情形,这个就是lint为开发者的提醒。handler运行于UI线程,不断处理来自MessageQueue的消息,如果handler还有消息需要处理但是Activity页面已经结束的情况下,Activity的引用其实并不会被回收,这就造成了内存泄漏。解决方案,一是在Activity的onDestroy方法中调用handler.removeCallbacksAndMessages(null);取消所有的消息的处理,包括待处理的消息;
8,页面背景图
在布局和代码中设置背景和图片的时候,如果是纯色,尽量使用color;如果是规则图形,尽量使用shape画图;如果稍微复杂点,可以使用9patch图;如果不能使用9patch的情况下,针对几种主流分辨率的机型进行切图。如果ImageView的背景图是会变化的,则在布局文件xml中不添加android.src=""属性,而是在代码中设置背景资源图。
相关文章推荐
- 我是如何自学Android,资料分享
- 菜鸟学Android(四十四):jsp标签技术简介及jsp标签的开发详解
- android动画
- Android Api Demos登顶之路(二十一)Secure Surface
- Ubuntu下Android真机调试
- Android基础入门教程——2.3.7 ProgressBar(进度条)
- Android Service 与 Activity使用Pending Intent通信
- Android自定义View时添加自己的监听器
- Android之——激活应用程序的详情界面
- android
- Android ListView&异步加载的学习(二)——多线程加载图片
- Android Bitmap大量使用不产生OOM之“加载大图片资源优化”
- Android 4.4 Graphic Architecture
- android学习连接网页
- 在ubuntu 14.04上编译android 5.0.2源码
- Android 中ContentProvider和Uri详解------vnd.android.cursor.dir与vnd.android.cursor.item
- Android-Activity之间数据传递的多种方式
- Android 四大组件之Content Provider
- Android Studio 视图解析
- Android中visibility属性VISIBLE、INVISIBLE、GONE的区别