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