handler为开发者提供了不少便利.
但是由于handler是内部类.
如果处理不当有可能引起activity不能即使释放
内部类的构造函数隐式的持有外部类的引用
public class TestActivity extends Activity {
private static class MyHandler extends Handler {
private final WeakReference<TestActivity> mActivity;
public MyHandler(SampleActivity activity) {
mActivity = new WeakReference<TestActivity>(activity);
}
@Override
public void handleMessage(Message msg) {
TestActivity activity = mActivity.get();
if (activity != null) {
//do Something
}
}
}
采用弱引用来避免.关于java引用的一些学习
基础知识:java对象的生命周期
- 创建阶段(
Created
) - 应用阶段(
In Use
) - 不可见阶段(
Invisible
) - 不可达阶段(
Unreachable
) - 收集阶段(
Collected
) - 终结阶段(
Finalized
) - 对象空间重分配阶段(
De-allocated
)
强引用是使用最普遍的引用。如果一个对象具有强引用,那垃圾收器绝不会回收它。当内存空间不足,Java虚拟机宁愿抛出OutOfM moryError
错误,使程序异常终止,也不会靠随意回收具有强引用 对象来解决内存不足的问题。
软引用是用来描述一些还有用但并非必须的对象。对于软引用关联着的对象,在系统将要发生内存溢出异常之前,将会把这些对象列进回收范围进行第二次回收。如果这次回收还没有足够的内存,才会抛出内存溢出异常。具体来说就是当内存不够用需要进行gc时,此时并不会回收关联的对象,但是会把软引用关联的对象放入回收列表中,回收完成以后发现内存还是不够用.那就把软引用关联的对象也进行回收.
弱引用也是用来描述非必须对象的,他的强度比软引用更弱一些,被弱引用关联的对象,在垃圾回收时,如果这个对象只被弱引用关联(没有任何强引用关联他),那么这个对象就会被回收。当gc发生时,第一波就被带走了.
虚引用:一个对象是否有虚引用的存在,完全不会对其生存时间构成影响,也无法通过虚引用来获取一个对象的实例。为一个对象设置虚引用关联的唯一目的就是能在这个对象被收集器回收时收到一个系统通知。虚引用和弱引用对关联对象的回收都不会产生影响,如果只有虚引用活着弱引用关联着对象,那么这个对象就会被回收。它们的不同之处在于弱引用的get
方法,虚引用的get
方法始终返回null
,弱引用可以使用ReferenceQueue
,虚引用必须配合ReferenceQueue
使用。
举个栗子:富豪有三个儿子:第一个嫡出(强引用),第二个庶出(软引用),第三个寻花问柳不小心得到的(弱引用),第四个帽子戏法.