* 此时的Context 还是上一个activity实例的Context,所以,上一个activity实例并未被释放,造成内存泄漏
*
* 此时,只需要将application的上下文,作为context即可解决问题

* @param context
* @return
*/
public static SingleExample getExampleInstance(Context context) {
if (mExample == null) {
mExample = new SingleExample(context);
}
return mExample;
}
}
2.非静态内部类(匿名内部类) 的内存泄漏
非静态内部类实例:
public class MainActivity extends Activity {
//会持有MainActivity实例。MainActivity.this.a
public void load(){
new Thread(new Runnable() {
@Override
public void run() {
while(true){
try {
int b=a;
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
}
}
解决方案:
将非静态内部类修改为静态内部类。因为静态内部类不会隐士持有外部类
3.Handler 造成的内存泄漏
Java对引用的分类有 Strong reference, SoftReference, WeakReference, PhatomReference 四种。
在Android应用的开发中,为了防止内存溢出,在处理一些占用内存大而且声明周期较长的对象时候,可以尽量应用软引用和弱引用技术。
在 java里没有象c++中的,所谓的析构函数 ,因为当一个对象不在使用的时候,它会自动被垃圾回收器回收,所以也就用不着析构函数了, 那个finalize 也只有在被垃圾回收器回收,才会被执行,而且很多时候,垃圾回收器并不一定执行,所以它不能当做c++中的,所谓的析构函数使用, 虚函数在java里也是没有的,比较象近的应该算是abstract。
虚引用 (phantomreference), 这是一个最虚幻的引用类型 . 无论是从哪里都无法再次返回被虚引用所引用的对象 . 虚引用在系统垃圾回收器开始回收对象时 , 将直接调用 finalize() 方法 , 但不会立即将其加入回收队列 . 只有在真正对象被 gc 清除时 , 才会将其加入 reference 队列中去 .。
weakreference是弱引用,其中保存的对象实例可以被gc回收掉。
软引用可以和一个引用队列(referencequeue)联合使用,如果软引用所引用的对象被垃圾回收器回收,java虚拟机就会把这个软引用加入到与之关联的引用队列中。
Handler 实例:
5:从端sms的收发//如下 主要用于内部改变,向外面的界面(activity)做反应class smshandler extends handler{ public void handlemessage(message msg) { //handle message }}// 对收到短消息后,做出的处理,这里直接删除,并没有反应到界面,所以上面的handlemessage是空的。
它在 javascript 内部有一些使用场景(比如声明原型链的终结foo.prototype = null),但是大多数情况下都可以使用undefined 来代替。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/ruanjian/article-89859-4.html
联想赶紧高价收购