首页 > 学院 > 开发设计 > 正文

非静态内部类、非静态匿名内部类会持有外部对象的引用

2019-11-09 14:35:06
字体:
来源:转载
供稿:网友
非静态内部类、非静态匿名内部类会持有外部对象的引用,静态内部类、静态匿名内部类则不会持有外部对象的引用非静态匿名内部类非静态匿名内部类为何会持有外部类的引用呢?静态匿名内部类不持有外部对象的引用非静态态内部类里面不允许有静态方法(因为非静态内部类方法的调用必须依赖外部对象的创建)。The method test cannot be declared static; static methods can only be declared in a static or top level type外部类:外部类不持有MainActivity的引用在Android中,长时间运行的任务和Acyivity生命周期进行协调会有点困难,如果你不加以小心的话会导致内存泄漏。关于如何处理这个棘手的问题,下面有几个基本的技巧供参考      1、使用静态内部类/匿名类,不要使用非静态内部类/匿名类.非静态内部类/匿名类会隐式的持有外部类的引用,外部类就有可能发生泄漏。而静态内部类/匿名类不会隐式的持有外部类引用,外部类会以正常的方式回收,如果你想在静态内部类/匿名类中使用外部类的属性或方法时,可以显示的持有一个弱引用。     2、不要以为java永远会帮你清理回收正在运行的threads.在上面的代码中,我们很容易误以为当Activity结束销毁时会帮我们把正在运行的thread也结束回收掉,但事情永远不是这样的!Java threads会一直存在,只有当线程运行完成或被杀死掉,线程才会被回收。所以我们应该养成为thread设置退出逻辑条件的习惯。     3、适当的考虑下是否应该使用线程.Android应用框架设计了许多的类来简化执行后台任务,我们可以使用与Activity生命周期相关联的Loaders来执行简短的后台查询任务。如果一个线程不依赖与Activity,我们还可以使用Service来执行后台任务,然后用BroadcastReceiver来向Activity报告结果。另外需要注意的是本文讨论的thread同样使用于AsyncTasks,AsyncTask同样也是由线程来实现,只不过使用了Java5.0新增并发包中的功能,但同时需要注意的是根据官方文档所说,AsyncTask适用于执行一些简短的后台任务
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表