你有没有感觉你的安卓手机开机后,可用内存不断减少。很大一部分原因是由于内存泄漏。这部分泄漏的内存无法回收,所以可用内存越来越少;什么是内存泄漏?GC无法回收应该回收的对象,这个对象导致内存泄漏。1.Bitmap使用后忘记回收,因为bitmap实现部分通过JNI调用Native方法,GC机制无法正常回收Bitmap申请的那部分内存空间(API10之前是这样的,后来是在堆中分配,但为了与旧版本兼容...显式调用回收也可以让GC更快地回收和调用自身);那么Bitmap应该如何回收呢?//bitmap!=null应该放在前面。如果位图为空再调用isRecycled方法会报错virtualreferencestate,这样GC可以更快的回收它}接下来,我们来说说两种比较常见的内存泄漏。基于这两个,可以展开btn_hint.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewv){Toast.makeText(MainActivity.this,"Hello",Toast.LENGTH_SHORT).show();}});是不是很常见,平时可能会这样写(封装起来的意思是一样的,只要是引用currentactivity就行),你可能想问,这里有什么问题吗?问题在于,如果用户在Toast消失前按下了返回键,Activity就会造成内存泄漏。为什么?Toast持有当前Activity,使得Activity无法被GC销毁解决方案:让Toast持有ApplicationContext;其实只要不是Layout,Context都可以用ApplicationContext;如果拿到了Context,就需要依赖Context来获取资源。这时候,你可以考虑在你的Application中维护一个全局的Context。用于不能直接获取Context的类,保存传递的参数(视图不推荐使用ApplicationContext)privatestaticContextmContext;publicstaticMyApplicationgetInstance(){//用于外部调用...returnmApplication;}@OverridepublicvoidonCreate(){super.onCreate();mContext=getApplicationContext();}另一种常见的...内存泄漏newThread(){publicvoidrun(){//网络请求};}.start();这里也有问题?你他妈的在开玩笑吗?在Activity中新建一个线程来发起网络请求。如果线程还没有结束,用户按下了返回键,内存泄漏的原因是一样的:Thread是一个匿名的内部类,所以会隐式持有外部类(这里是Activity)解决方法:各种各样的;不使用匿名内部类,或者为整个应用维护一个线程池,或者维护一个线程队列,后两者是为了让线程独立于Activity,避免内存泄漏;资源获取等等处处都需要Context,很多地方都用到了匿名内部类,导致这里潜在的内存泄漏很大,但是平时很多朋友可能没有注意到。希望这篇文章能给你一些启发。.
