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

时间:2016-03-30 08:14:07

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

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

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

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

或者

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

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

1 个答案:

答案 0 :(得分:6)

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

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

  1. 听众必须始终正确注册,否则会导致内存泄漏。
  2. 您需要为每种事件类型创建一个新类。很快这个数字就会增长。
  3. 继承和事件总线不能很好地发挥作用。没有适当的“重写”听力方法。
  4. 也许其他一些对象也请求相同的数据。由于EventBus向所有人广播,因此听众可能会在不期望的时间获得相同类型的多个事件。
  5. 特别是对于Retrofit的使用,如果您以异步方式执行请求:

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

    然后,您必须记住在组件的生命周期完成时取消组件所做的所有调用。 onDestroy() ActivityonDetach() FragmentonDetachFromWindow() View

    repos.cancel();