博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android Handler内存泄漏和解决方法
阅读量:2389 次
发布时间:2019-05-10

本文共 2584 字,大约阅读时间需要 8 分钟。

一、Handler内存泄漏原因

handler发送的消息在当前handler的消息队列中,如果此时activity finish掉了,那么消息队列的消息依旧会由handler进行处理,若此时handler声明为内部类(非静态内部类),我们知道内部类天然持有外部类的实例引用,那么就会导致activity无法回收,进而导致activity泄露。

二、Handler内存泄漏几种情况

1、隐式引用

public class CameraVerifyActivity extends Activity {    @Override    protected void onCreate(@Nullable Bundle savedInstanceState) {        super.onCreate(savedInstanceState);    }        private class MyHandle extends Handler {        @Override        public void handleMessage(Message msg) {            super.handleMessage(msg);    }}

2、显示引用

public class CameraVerifyActivity extends Activity {    MyHandle myHandler;        @Override    protected void onCreate(@Nullable Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        myHandle = new MyHandle(this);    }        private class MyHandle extends Handler {        public MyHandle(Activity activity) {        }                @Override        public void handleMessage(Message msg) {            super.handleMessage(msg);    }}

3、Handle调用Runnable

public class CameraVerifyActivity extends Activity {    @Override    protected void onCreate(@Nullable Bundle savedInstanceState) {        super.onCreate(savedInstanceState);    }    class MyRunnable implements Runnable {        private View view;        public MyRunnable(View view) {            this.view = view;        }        public void run() {            // ... do something with the view        }    }}

三、Handler内存泄漏解决方法

1、针对1(添加static):

public class CameraVerifyActivity extends Activity {    @Override    protected void onCreate(@Nullable Bundle savedInstanceState) {        super.onCreate(savedInstanceState);    }        private static class MyHandle extends Handler {        @Override        public void handleMessage(Message msg) {            super.handleMessage(msg);    }}

2、针对2(添加弱引用):

public class CameraVerifyActivity extends Activity {    MyHandle myHandler;        @Override    protected void onCreate(@Nullable Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        myHandle = new MyHandle(this);    }        private static class MyHandle extends Handler {        private WeakReference
reference; MyHandle(CameraVerifyActivity activity) { reference = new WeakReference
(activity); } @Override public void handleMessage(Message msg) { super.handleMessage(msg); }}

3、同2一样

四、Handler内存泄漏总结

1.使用static 修饰的handler,但是一般会弱引用activity对象,因为要使用activity对象中的成员

2.单独定义handler,同样可以弱引用activity
3.使用内部类的handler,在onDestroy方法中removeCallbacksAndMessages
 

转载地址:http://asxab.baihongyu.com/

你可能感兴趣的文章
JXplorer 的简单使用
查看>>
如何启用 LDAP 签名 Windows Server 2008 中
查看>>
获取ngnix,apache,php,mysql的编译参数 zz from xi4oyu
查看>>
使用ettercap嗅探ssh口令
查看>>
Linux下的内网反弹实例
查看>>
Command execution with a MySQL UDF
查看>>
OTPs: Using s/Key with SSH via OPIE
查看>>
使用arpwatch和arping来排查ARP攻击
查看>>
Linux硬件监控方法
查看>>
RSA SecurID Authentication linux sshd PAM deploy
查看>>
转: pam 禁止某些用户使用ssh 远程登录
查看>>
小包优先+web优先+游戏爆发+单IP限速+连接数限制 脚本V2.0
查看>>
Rhel5 配置NTP服务
查看>>
定制rhel的stage2.img/minstg2.img文件
查看>>
ZZ Quick-Tip: Linux NAT in Four Steps using iptables
查看>>
北京的住房公积金是否可用于还外地的房贷
查看>>
mysqlhotcopy 热备工具体验与总结
查看>>
MooseFS安装笔记
查看>>
GlusterFS分布式集群文件系统安装、配置及性能测试
查看>>
Sakai
查看>>