查看侦听器和网络回调是否会导致内存泄漏问题?

时间:2018-01-08 07:28:29

标签: android memory-leaks callback onclicklistener

非静态内部类对象将具有外部类对象的引用,如果匿名对象如视图OnClickListener或网络响应Callback具有比Activity或其他外部类对象更长的生命周期,这种情况会导致内存泄漏吗?如果它会,可以做些什么来解决这个问题?

2 个答案:

答案 0 :(得分:3)

是的,这种情况会导致内存泄漏。

  

避免/修复

     
      
  1. 不要保留长寿命的引用(使用WeakReference)
  2.   
  3. 避免使用非静态内部类
  4.   
  5. 清理/停止所有处理程序/侦听器onDestroy();
  6.   

看看这个项目

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生命周期,如果处理不当会导致内存泄漏。

解决方案

  1. 在销毁Activity时取消所有后台任务或网络电话,即activity方法。
  2. onDestroystatic创建AsynTask内部类,如果需要,则传递Handlers的弱引用。