弱引用vs eventbus以避免内存泄漏android?

Nit*_*tin 2 android memory-leaks design-patterns callback heap-memory

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

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

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

要么

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

请考虑避免内存泄漏的好处.

S.D*_*.D. 6

在弱引用中保存回调/监听器不是一个好主意.看到

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

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

特别是对于Retrofit的使用,如果您异步执行请求,请执行以下操作:

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

Call<List<Repo>> repos = service.listRepos("octocat");
repos.enqueue(myCallback)
Run Code Online (Sandbox Code Playgroud)

然后,您必须记住在组件的生命周期完成时取消组件所做的所有调用.即onDestroy()Activity,onDetach()Fragment,onDetachFromWindow()View:

repos.cancel();
Run Code Online (Sandbox Code Playgroud)

  • @Nitin最好的方法是"不要造成"内存泄漏.如果您遵循在不再有用时取消注册回调和听众的良好习惯,在不需要时跟踪和取消请求,您将处于安全的一面. (2认同)