永发信息网

如何避免内存泄漏,oom异常,anr异常

答案:2  悬赏:30  手机版
解决时间 2021-04-15 20:47
如何避免内存泄漏,oom异常,anr异常
最佳答案
内存泄露的原因:
1. Handler造成内存泄漏

private Handler handler = new Handler(){
@Override
public void handMessage(Message msg){

}
}
当使用内部类(包括匿名类)来创建Handler时,Handler对象会隐式地持有一个外部类对象(通常是一个Activity)的引用。
而Handler通常会伴随一个耗时的后台线程(例如访问网络或者从网络上拉取图片)一起出现,这个后台线程在任务执行完毕(例如图片下载完成)之后,通过消息机制通知Handler,然后Handler把图片更新到界面上(主线程中)。
当用户在网络请求过程中关闭了Activity,正常情况下,Activity不再被使用,它就有可能在GC检查时被回收掉。但是由于这时线程尚未执行完,而该线程持有Handler的引用,Handler持有Activity的引用,就导致Activity无法被回收(即内存泄露),直到网络请求结束(例如图片下载完成)。
另外,如果你执行了Handler的postDelayed()方法,该方法会将你的Handler装入一个Message,并把这条Message推到MessageQueue中,那么在你设定的delay到达之前,会有一条MessageQueue —> Message —> Handler —> Activity的链,导致你的Activity被持有引用而无法被回收。
使用Handler导致内存泄露的解决办法:
一、通过程序逻辑进行保护
A. 在finish Activity的时候停掉你的后台线程,线程停掉了,就相当于切断了Handler与外部连接的线,Activity自然会在合适的时候被回收。
B. 如果Handler被delay的Message持有了引用,那么使用相应的Handler的removeCallbacks()方法,把消息对象从消息队列中移除即可。
二、将Handler声明为静态类
静态类不持有外部类的引用对象,所以Activity可以随意被回收。
static class MyHandler extends Handler{

@Override
public void handleMessage(Message msg){
}
}
此时由于Handler不再持有外部类对象的引用,导致程序不允许你在Handler中操作Activity中的对象。所以你需要在Handler中增加一个对Activity的弱引用(WeakReference)
static class MyHandler extends Handler{
WeakReference activityReference;
public MyHandler(Activity activity){
activityReference = new WeakReference(activity);
}

@Override
public void handleMessage(Message msg){
final Activity activity = activityReference.get();
}
}
对应以上的代码,用户在关闭Activity之后,就算后台线程还没结束,但由于仅有一条来自Handler的弱引用指向Activity,所以GC仍然会在检查的时候把Activity回收掉。
So, 关于Handler内存泄露的问题就不会出现。
全部回答
任务占坑
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
为什么男人要挣钱养家啊??
如何做球队老大
女友生日了
桐山岩大红袍这个地址在什么地方,我要处理点
活着中的经典语句,史铁生散文集《活着的事》
DNF里的宠物 怎么得到?
瑞纳加92号还是95号油?
美国队长3里的明星用的什么牌子的手机
谁帮我开通QQ牧场?
你们觉得杨洋和赵丽颖有可能吗
梦幻西游中人气会影响战斗中宝宝的出现几率么
潍坊市主要农产品与其主要产地对应正确的是A.
关于娇韵诗白吸的问题。
有2004年毕业于武汉中南财经政法大学会计系毕
中华鸭脖清姜店地址有知道的么?有点事想过去
推荐资讯
和老婆吵架 她一夜未归手机开机也不接 不管去
85度C湖州长兴店在哪里啊,我有事要去这个地
C语言中怎么比较字符的大小
这是哪首歌?太监最不喜欢的是哪首歌?
QQ网页游戏丝路大司马长史要升到下一个官阶要
女生生日送什么好
什么防脱洗发水好用,哪些洗发水适合男的用
谢霆锋的24张专辑都是哪些?
imessage发出去,显示已送达,然后在发出者手
绝味鸭脖西一路店地址有知道的么?有点事想过
陕西农科化肥有限公司渭南配送中心我想知道这
和男友分开时间长了,应该要等他还是不等啊?
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?