Android学习笔记之SoftReference软引用...
PS:其实这一篇和上一篇很类似,都是为了解决内存不足(OOM)这种情况的发生...
学习内容:
1.对象的引用类....
最近也是通过项目中知道了一些东西,涉及到了对象的引用类,对象的引用类分为多种,强引用(其实就是正常的引用),使用SoftReference实现软引用,Weak Reference(弱引用) PhantomRefrence(虚引用)...这三个引用类我只详细的介绍一下SoftReference实现软引用...其他的就一笔带过....
强引用:
Object darker=new Object();
Object darker_1=darker;
darker=null;
darker_1=null;
强引用其实相对而言就非常的简单,也就是我们一般实例化对象后,对对象的一个引用就属于强引用,并且只要这个引用存在,那么GC(垃圾回收器)也就绝对不会去回收当前被引用的对象...如果将这个对象的引用设置为null,那么就代表GC可以对这个对象进行回收了...
软引用:
软引用是我要细说的一个部分,先说一下软引用的一个引用目的,软引用的使用是与内存挂钩的一个引用类,主要应用于内存敏感的高速缓存,其实在Android中是经常使用的到的,由于Android的虚拟机是基于寄存器的Dalvik,它的堆大小只有16M,我们都清楚无论是Android应用程序,还是Java引用程序,在实例化对象的时候都是在堆中完成的...因此在Android中这个堆的大小要求确实是很苛刻的,一旦我们读取的资源数据过大,或者是内存里的对象由于声明的周期太长,没有被及时的释放,那么就很有可能造成OOM的发生...我们都知道GC的回收机制在正常的情况下并不是时时刻刻都在工作的,它的工作时间是不定期的,因此如果在GC不工作的期间我们的内存已经爆表,那就必定导致程序终止...OOM在Android是经常见到的一种情况,对象的不及时释放,static关键字的使用,线程不可控,还有最常见的就是在读取Bitmap的时候导致这种情况的发生...
那么OOM是一个非常严重的问题,但是如果内存得不到充分的使用,这个其实也是一个潜在的问题,SoftReference(软引用),其实给我的感觉就是为了解决这样的问题,每一个对象通过软引用进行实例化,那么这个对象的数据也就会被保存起来,当需要再次调用这个对象中的数据的时候,只需要通过对象的get()方法就可以获取到该对象所保存的数据信息,其实也会是我们所说的cache,当内存快要不足的时候,GC会迅速的把所有的软引用清除掉,释放内存空间...这样不仅结合了对象的cache,同时还解决了OOM的发生,一举两得...虽然说是一举两得的东西,保证了内存能够安全的被使用,那么相反就要牺牲效率,在每一个软引用对象被实例化的时候,其实还是需要耗费许多的时间的...因此到底如何运用,取决于我们遇到的问题.
简单的来一段小代码...
Object obj=new Object();
SoftRefenrence sc = new SoftReference(obj);//这里使用了软引用... /*
*在这个期间,有可能会出现内存不足的情况发生,那么GC就会直接把所有的软引用全部清除..并释放内存空间
*如果内存空间足够的话,那么就GC就不会进行工作...
*GC的工作取决于内存的大小,以及其内部的算法,,,,
*/ if(sr!=null){
//如果软引用还存在,那么直接就可以获取这个对象的相关数据...这样就实现了cache...
obj = sr.get(); }else{
//如果已经不存在,表示GC已经将其回收,我们需要重新实例化对象,获取数据信息... obj = new Object();
sr = new SoftReference(obj);
}
很简单的一段代码,没什么实际的意义,只是为了方便理解...在Android中,其实有一些时候还是由于Bitmap的问题导致内存不足的发生,图片相对而言还是比较大的,像素高的图片在读取的情况下是非常耗费内存的,如果读取的图片过多的话,那就更加的显而易见了,图片过多,内存会被吃的非常的紧,因此我们需要在Bitmap中去使用软引用,这样就可以避免OOM的发生...还可以有效的去使用内存...
还是简单的说一下其中的道理,比如说我们读取到了一张图片,这张图片被读取后就以cache的形式保存起来...当我们的应用程序如果还是需要这张图片的资源数据的话,那么直接通过软引用中的get()方法,就可以得到图片中的资源数据,..这样就没必要再次进行读取了,直接从cache中就可以读取得到,如果图片过多,保存的对象也会越来越多,那么当内存将要发生OOM的时候,GC会迅速把所有的软引用,也就是这些对象的引用和内控件迅速释放...防止OOM的发生...下面贴一段小小的代码...
import java.lang.ref.SoftReference;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map; import android.graphics.Bitmap; public class MemoryCache { //将HashMap封装成一个线程安全的集合,并且使用软引用的方式防止OOM(内存不足)...
//由于在ListView中会加载大量的图片.那么为了有效的防止OOM导致程序终止的情况...
private Map<String,SoftReference<Bitmap>>cache=Collections.synchronizedMap(new HashMap<String, SoftReference<Bitmap>>()); public Bitmap get(String id){
if(!cache.containsKey(id))
return null;
SoftReference<Bitmap>ref=cache.get(id);
return ref.get(); } public void put(String id,Bitmap bitmap){
cache.put(id, new SoftReference<Bitmap>(bitmap));
} public void clear(){
cache.clear();
}
}
这段代码也非常的简单...就是定义了一个集合,将Bitmap的软引用保存在集合当中,如果图片资源存在于集合内部,那么直接就进行取出操作即可...如果存储的容量过大..超出了内存的限制..那么直接调用clear函数将其清空...这段代码隶属于一个项目中的小模块....
最后简单的说一下弱引用...
弱引用:
弱引用其实和软引用差不太多,不过是使用WeakReference去实例化一个对象,并且GC是不会根据内存的原因去指定时间去回收对象...弱引用可以在未被GC回收之前的任意时间段,都能获取到这个对象的相关信息...一旦GC将其回收,那么就获取不到这个对象的相关数据了...该回收的时候,GC会自动的将其进行回收,不会根据内存的大小而决定时候去释放这个对象所占用的内存...简单的举个例子...
Object obj = Object A(); WeakReference wr = new WeakReference(obj); obj = null; //在这个时间段....短时间内GC不会被启动...那么我们就可以再次获取到这个对象保存的数据信息...
//在这个期间如果GC启动了回收,那么就无法获取到这个对象所包含的数据信息了... if (wr.get()==null) { System.out.println("obj 已经被清除了 "); } else { System.out.println("obj 尚未被清除,其信息是 "+obj.toString()); } }
总之软引用的使用是为了解决OOM的状况发生...避免OOM的发生不仅仅只使用SoftReference,还有一些其他的方式,比如说减少static关键字的使用,在app中尽量去使用Application中的Context对象...避免线程不可控的情况发生,都是避免OOM的发生的方式...使用SoftReference更多的是在app中加载Bitmap而发生OOM...最后给大家一个源码..这个源码在上一篇文章发过了...这个源码中不仅包含BitmapFactory.Options,还包括SoftReference...还有一些零碎的知识点...总之大家看了这个源码...就能明白其中的道理....
源码:http://files.cnblogs.com/files/RGogoing/daimarufeng.zip
Android学习笔记之SoftReference软引用...的更多相关文章
- Android学习笔记之SoftReference软引用,弱引用WeakReference
SoftReference可以用于bitmap缓存 WeakReference 可以用于handler 非静态内部类和匿名内部类容易造成内存泄漏 private Handler mRemoteHand ...
- [Android] Android开发优化之——使用软引用和弱引用
Java从JDK1.2版本开始,就把对象的引用分为四种级别,从而使程序能更加灵活的控制对象的生命周期.这四种级别由高到低依次为:强引用.软引用.弱引用和虚引用. 这里重点介绍一下软引用和弱引用. ...
- Android开发优化之——使用软引用和弱引用
Java从JDK1.2版本开始,就把对象的引用分为四种级别,从而使程序能更加灵活的控制对象的生命周期.这四种级别由高到低依次为:强引用.软引用.弱引用和虚引用. 这里重点介绍一下软引用和弱引用. 如果 ...
- 【转】 Pro Android学习笔记(五七):Preferences(1):ListPreference
目录(?)[-] 例子1ListPreference小例子 定义一个preferences XML文件 继承PreferenceActivity 用户定制偏好的读取 第一次运行时设置缺省值 设置Cat ...
- 【转】 Pro Android学习笔记(二九):用户界面和控制(17):include和merge
目录(?)[-] xml控件代码重用include xml控件代码重用merge 横屏和竖屏landsacpe portrait xml控件代码重用:include 如果我们定义一个控件,需要在不同的 ...
- 【转】 Pro Android学习笔记(二二):用户界面和控制(10):自定义Adapter
目录(?)[-] 设计Adapter的布局 代码部分 Activity的代码 MyAdapter的代码数据源和构造函数 MyAdapter的代码实现自定义的adapter MyAdapter的代码继续 ...
- 【转】Pro Android学习笔记(七):了解Content Provider(下上)
我们通过一个Content Provider小例子进行详细说明.数据源是一个SQLite数据库,名字为books.db,该数据库只含有一个表格,名字为books.表格中含有name,isbn,auth ...
- 【转】Pro Android学习笔记(三):了解Android资源(上)
在Android开发中,资源包括文件或者值,它们和执行应用捆绑,无需在源代码中写死,因此我们可以改变或替换他们,而无需对应用重新编译. 了解资源构成 参考阅读Android学习笔记(三八):资源res ...
- Android学习笔记进阶18 之画图并保存图片到本地
1.首先创建一个Bitmap图片,并指定大小: 2.在该图片上创建一个新的画布Canvas,然后在画布上绘制,并保存即可: 3.需要保存的目录File,注意如果写的目录如“/sdcard/so ...
随机推荐
- 分布式Hadoop安装(一)
本文旨在介绍通过两台物理节点,实现完全分布式hadoop程序的部署 writen by Bob Pan@20140609 环境介绍: 主机名 机器IP 用途 描述 Hadoop0 192.168.80 ...
- Scala 深入浅出实战经典 第47讲:Scala多重界定代码实战及其在Spark中的应用
王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-64讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...
- 多线程socket编程示例
工程: 代码: package com.my.socket.business; /** * 业务实现类 * * @author ZY * */ public class CoreMisBusiness ...
- 在Android Studio进行“简单配置”单元测试(Android Junit)
起因 在Android studio 刚出.本人就想弄单元测试,可惜当时Android studio不知道抽什么风(准确来说,应该是我不会弄而已).无法执行到相应的代码.后来今天突然自己又抽风.又想去 ...
- eclipse无线连接android真机能进调试
将手机与电脑连接到同一个网段, 在手机上安装wifi adb程序,并打开,会得到一个IP及端口,比如是 192.168.1.126:5555 进入android sdk目录sdk\platform-t ...
- LINQ TO ENTITY 根据Birthday获取Age
from emp in EmployeeInfo let years = EntityFunctions.DiffYears(emp.Birthday.Value,DateTime.Now) let ...
- 配置ini指定eclipse启动JDK版
eclipse mars1 需要JDK 1.7+ 解决方案: 改eclipse.ini配置文件 -startupplugins/org.eclipse.equinox.launcher_1.3.100 ...
- 图解 & 深入浅出JavaWeb:事务必会必知
事务,大家所熟悉的事务(Transcation),基本上会就往Spring事务靠.其实Spring事务管理基于底层数据库本身的事务处理机制.数据库事务的基础,是掌握Spring事务管理的基础.这篇总结 ...
- UML2
UML中有3种构造块:事物.关系和图,事物是对模型中最具有代表性的成分的抽象:关系是把事物结合在一起:图聚集了相关的的事物.具体关系图标如下 说明:构件事物是名词,是模型的静态部分.行为事物是动态部分 ...
- EDM营销之双十一最新实战营销指南汇总
双十一虽已进入第八个年头,但其影响力只增不减,倒计时期间商家们都已火力全开.再结合全社会消费升级的大背景,如何才能在激烈竞争中杀出一条血路呢? 本次Focussend基于实战操作,以短信营销.邮件营销 ...