非静态内部类对象将具有外部类对象的引用,如果匿名对象如视图OnClickListener或网络响应Callback具有比Activity或其他外部类对象更长的生命周期,这种情况会导致内存泄漏吗?如果它会,可以做些什么来解决这个问题?
答案 0 :(得分:3)
避免/修复:
- 不要保留长寿命的引用(使用WeakReference)
- 避免使用非静态内部类
- 清理/停止所有处理程序/侦听器onDestroy();
醇>
看看这个项目
https://github.com/AliEsaAssadi/avoid-memory-leak-android
我解释并展示Android开发中常见的内存泄漏模式以及如何解决它们
如何避免网络响应回调内存泄漏
在AsyncTask中这里的例子可以让你得到关于:
的答案当我们使用Inner class
/ static class
时如何避免这种情况,并展示使用WeakReference进行网络响应回调的最佳实用方法
答案 1 :(得分:1)
如果您在h2d(d2h())
类似事件回调中有匿名类声明,则不会导致任何问题,因为它的生命周期将与Activity
生命周期相结合如果没有Activity
活着,它甚至不会持久。但是当它们在后台工作线程上进行网络调用时,它的生命周期和范围与Activity
不同,所以如果你有Activity
non-static
等,它们可以承受很长时间而不会取决于Asynctaks,Hanlders
生命周期,如果处理不当会导致内存泄漏。
解决方案
Activity
时取消所有后台任务或网络电话,即activity
方法。onDestroy
或static
创建AsynTask
内部类,如果需要,则传递Handlers
的弱引用。