1、单例模式:单例具有静态特性,它的生命周期和整个应用一样长,这就说明了如果一个对象已经不需要使用了,而单例对象还持有该对象的引用,那么这个对象将不能被正常回收,这就导致了内存泄漏。
例如:
错误的(context传入的为Activity就会造成内存泄漏):
class SimpleInstance {
private static SimpleInstance instance;
private static Context context;
private SimpleInstance(Context context) {
This.context = context;
}
public static SimpleInstance getInstance() {
if (instance == null) {
instance = new SimpleInstance(Context context);
}
return instance;
}
}
正确的:
class SimpleInstance {
private static SimpleInstance instance;
private static Context context;
private SimpleInstance(Context context) {
this.context = context.getApplicationContext();
}
public static SimpleInstance getInstance() {
if(instance == null) {
instance = new SimpleInstance(Context context);
}
return instance;
}
}
2、匿名内部类/非静态内部类的静态实例
匿名内部类/非静态内部类隐式持有外部类的引用
错误的:
class Human {
class Man {}
private static Man man;
public Human() {
man = new Man();
}
}
正确的:
class Human {
class static Man {}
private static Man man;
public Human() {
man = new Man();
}
}
3、handler和线程:匿名内部类
错误的:
class MainActivity extends Activity {
private Handler handler = new Handler() {
private void handleMessage(Message msg) {}
};
public void onCreate() {
thread t = new Thread() {
public void run() {
handler.sendMessage();
}
}.start();
}
}
正确的:
class MainActivity extends Activity{
private MyHandler handler=new MyHandler ();
static class MyHandler extends Handler {
WeakReference mActivityReference;
MyHandler(Activity activity) {
mActivityReference= new WeakReference(activity);
}
@Override
public void handleMessage(Message msg) {
final Activity activity = mActivityReference.get();
if (activity != null) {
mImageView.setImageBitmap(mBitmap);
}
}
}
onDestory(){
Handler.removeCallbacksAndMessages(null);
}
错误的:
new Thread(new Runnable() {
@Override
public void run() {
SystemClock.sleep(10000);
}
}).start();
正确的:
static class MyRunnable implements Runnable {
@Override
public void run() {
SystemClock.sleep(10000);
}
}
new Thread(new MyRunnable()).start();
4、资源未释放
对于使用了BraodcastReceiver,ContentObserver,File,Cursor,Stream,Bitmap等资源的使用,应该在Activity销毁时及时关闭或者注销,否则这些资源将不会被回收,造成内存泄漏。
网友评论