Handler最正确的写法(避免内存泄露)


/**                         Handler最正确的写法:  handler重点在  原理  和 内存泄露
 * 
 * 
 * Handler的内存泄露问题:
 * 目的:当一个handler延时10分钟执行完毕,但是没执行完毕当前的Activity被finish(),handler执行时需要当前的界面,界面执行了finish但是后台依然在
 * 运行,实际没有关闭,这会导致内存泄露。
 * 
 * 6.handler的内存泄露问题:
  1.定义一个内部类时,会默认拥有外部类对象引用,所以建议使用内部类 时,最好定义为一个静态内部类
  2.引用的强弱: 强引用--软引用--弱引用
    普通new叫强引用,内存不足不会自动回收,销毁或制空才会被回收
    软引用:一个对象引用到另一个对象(如果内存不足会回收这个对象)
    弱引用:  如果不存在  访问不到
 * 
 */
public class HandlerMemoryActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

handler.postDelayed(new Runnable() {
@Override
public void run() {
System.out.println("Runnable");
}
}, 1000*10*60);// 十分钟后执行
// 关闭当前Activity
finish();
}

/**
* 内部类      handler正宗写法    
* @author itotem
*
*/
private MyHandler handler = new MyHandler(this);
class MyHandler extends Handler{
// 弱引用 ,防止内存泄露
private WeakReference<HandlerMemoryActivity> weakReference;
public MyHandler(HandlerMemoryActivity handlerMemoryActivity){
weakReference = new WeakReference<HandlerMemoryActivity>(handlerMemoryActivity);
}

@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
// 通过  软引用  看能否得到activity示例
HandlerMemoryActivity handlerMemoryActivity = weakReference.get();
// 防止内存泄露
if (handlerMemoryActivity != null) {
// 如果当前Activity,进行UI的更新
}else {
// 没有实例不进行操作
}
}
}


}
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值