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

来源:互联网 发布:mysql 删除重复值 编辑:程序博客网 时间:2024/06/08 12:01

/**                         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 {
// 没有实例不进行操作
}
}
}


}
1 0
原创粉丝点击