您的位置:首页 > 其它

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 {

// 没有实例不进行操作

}

}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: