Handler最正确的写法(避免内存泄露)
2015-09-14 23:12
323 查看
/** 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 {
// 没有实例不进行操作
}
}
}
}
*
*
* 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 {
// 没有实例不进行操作
}
}
}
}
相关文章推荐
- gcc原子化操作
- javaScript this 详解
- c++中new/operator new/placement new
- 对Throwable的处理
- GOF23设计模式之 工厂模式
- 上层建筑——DOM元素的特性与属性(dojo/dom-prop)
- Eclipse修改workspace
- Javascript 中 Array的 sort()和 compare()方法
- (1.4.5.1)Java编程题——在一个字符串中查找第一个非重复的字符
- ArrayAdapter requires the resource ID to be a TextView问题
- 广度优先算法 越狱
- 为什么 O2O 领域融资额特别高?
- MyBatis+springMVC+easyUI (dataGirl)实现分页(转载)
- get与post方法各自设置页面提交乱码解决方案
- JAD
- HI3515海思开发板移植3G模块笔记
- JAVA垃圾回收机制
- C#做的颜色工具
- 为什么会出现死锁
- 杭电acm--2026