【问题标题】:weakreference vs eventbus to avoid memory leaks android?弱引用与事件总线以避免内存泄漏android?
【发布时间】:2016-07-18 02:57:52
【问题描述】:

我正在开发一个应用程序,我在其中使用改造库来调用 Web 服务。在调用 web 服务回调返回响应之后,我将响应传递给下一个活动。我想知道最好的方法。

我是记忆相关问题的新手,如果我完全错了,请纠正我。

我是否应该创建一个新类,然后将弱引用传递给该类并在主活动上从该类调用函数。

或者

我将在事件总线上注册一个新事件,当回调返回对象时,触发事件并调用函数。

请考虑什么是避免内存泄漏的好处。

【问题讨论】:

  • 如果weakReference同时被垃圾收集是否可以接受?行刑前?
  • 如果用户在同一个屏幕上,那么当回调发生时,我将接受响应并将用户带到下一个屏幕。

标签: android design-patterns memory-leaks callback heap-memory


【解决方案1】:

在弱引用中保存回调/侦听器不是一个好主意。见

您可以使用事件总线在完成时“广播”异步操作(在您的情况下为网络调用)的结果,并让其他对象(视图、片段、活动)注册到事件总线。注意事项:

  1. 侦听器必须始终正确取消注册,否则会导致内存泄漏。
  2. 您需要为每种事件类型创建一个新类。很快这个数字就会增长。
  3. 继承和事件总线不能很好地发挥作用。没有适当的“覆盖”侦听方法。
  4. 也许其他一些对象也请求了相同的数据。由于 EventBus 向所有人广播,因此侦听器可能会在意想不到的时间收到多个相同类型的事件。

特别是改造使用,如果你做异步请求:

GitHubService service = retrofit.create(GitHubService.class);

Call<List<Repo>> repos = service.listRepos("octocat");
repos.enqueue(myCallback)

那么你必须记得在组件的生命周期完成时取消组件所做的所有调用。即onDestroy()ActivityonDetach()FragmentonDetachFromWindow()View

repos.cancel();

【讨论】:

  • 您好我喜欢这个答案有没有其他方法可以消除内存泄漏。
  • @Nitin 最好的方法是not to cause 内存泄漏。如果您养成在不再有用时取消注册回调和侦听器,在不需要时跟踪和取消请求的好习惯,您将是安全的。
猜你喜欢
  • 2018-01-10
  • 2017-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多