赞
踩
Android的内存泄露(Memory Leak):
进程中某些对象已经没有使用价值了,但是他们却还可以直接或者间接地被引用到GC Root导致无法回收。public void loadData(){
//隐式持有MainActivity实例。MainActivity.this.a
new Thread(new Runnable() {我连MainActivity都被回收了,那Handler就有问题了。
{
mHandler.sendEmptyMessage(0);
mHandler.sendMessageAtTime(msg,10000);//atTime
}
//activity onDestroy把timer.cancel掉然后赋空
//错误的示范:
// mHandler是匿名内部类的实例,会引用外部对象MainActivity.this。如果Handler在Activity退出的时候,
它可能还活着,这时候就会一直持有Activity。
private Handler mHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what){
case 0:
//加载数据
break;
}
}
};
//解决方案:
private static class MyHandler extends Handler{
private MainActivity mainActivity;//直接持有了一个外部类的强引用,会内存泄露
//设置软引用保存,当内存一发生GC的时候就会回收。
private WeakReference<MainActivity> mainActivity; public MyHandler(MainActivity mainActivity) { this.mainActivity = new WeakReference<MainActivity>(mainActivity); } @Override public void handleMessage (Message msg){ super.handleMessage(msg); MainActivity main = mainActivity.get(); if (main == null || main.isFinishing()) { return; } switch (msg.what) { case 0: //加载数据 MainActivity.this.a; int b = main.a; break; } } };
SensorManager sensorManager = getSystemService(SENSOR_SERVICE);
Sensor sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ALL);
譬如:
自定义布局中的监听器:
public class MyView extends View{
public MyView(Context context){
super(context);
init();
}
//错误写法
// public MyView(Context context, AttributeSet attrs, MyListener myListener) {
// super(context, attrs);
// this.myListener = myListener;
// }
public interface MyListener{
void myListenerCallback();
}
private void init(){
ListenerCollector collector = new ListenerCollector();
collector.setsListener(this,myListener);
}
private MyListener myListener = new MyListener() {
@Override
public void myListenerCallback() {
System.out.print("有被调用");
}
};
}
public class ListenerCollector {
/**
* WeakHashMap,此种Map的特点是,当除了自身有对key的引用外,此key没有其他引用那么此map会自动丢弃此值
* 例如:int a = 1;
* Map weakmap = new WeakHashMap();
* weakmap.put(a, "aaa");
* a = null
* //此时weakmap里面的a会被丢弃。
*/
static private WeakHashMap<View, MyView.MyListener> sListener = new WeakHashMap<>();
public void setsListener(View view, MyView.MyListener listener) {
sListener.put(view, listener);
}
public static void clearListeners() {
//移除所有监听。
sListener.clear();
}
}
调用
@Override
protected void onStop() {
super.onStop();
ListenerCollector.clearListeners();
}
比如:轮播图效果等。
当不需要使用的时候,要记得及时释放资源。否则就会内存泄露。
相关参考博文:
http://www.cnblogs.com/shaweng/archive/2012/06/29/2570413.html
http://blog.csdn.net/soiol/article/details/52486871
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。