美文网首页
内存泄漏原因

内存泄漏原因

作者: 皮皮虾我们走_f5df | 来源:发表于2017-08-24 16:32 被阅读0次

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销毁时及时关闭或者注销,否则这些资源将不会被回收,造成内存泄漏。

相关文章

网友评论

      本文标题:内存泄漏原因

      本文链接:https://www.haomeiwen.com/subject/rkuedxtx.html