Android - Firebase - 我是否需要删除每个单一的监听器?

时间:2016-09-11 03:22:39

标签: android memory-leaks firebase firebase-storage

我做了一些合理的研究,找不到我需要的答案。

我所知道的事情:当我将ValueEventListener附加到数据库引用时,我知道我需要稍后将其删除(现在发现一些大量的内存泄漏。

我不知道的是什么:我还需要分离所有其他听众吗? (这包括Firebase数据库,存储和身份验证,我正在使用的三个API)

示例:

UploadTask uploadTask = ref.putFile(uploadFile);

uploadTask.addOnFailureListener(new OnFailureListener() {
    //@Override code here
}).addOnSuccessListener(new OnSuccessListener<UploadTask.TakeSnapshot>() {
    //@Override code here
}).addOnProgressListner(new OnProgressListner<UploadTask.TakeSnapshot>() {
    //@Override code here
};

我认为这足以向您展示我的意思。这就是我的实际代码目前的结构。

问题:

  1. 我是否需要删除所有这些侦听器以防万一 在此之前终止(系统决定,电话死亡,等等) 回调发生了吗?
  2. 我可以以某种方式捆绑它们并立即将它们全部三个终止 因为我在我的代码中有30个这样的人并且真的没有感觉到 喜欢重组所有这些以分配所有这些听众 变量JUST所以我可以将它们传递给 &#34; removeBlahBlahBlahListener(listenerVariable)&#34;一遍又一遍。
  3. 稍微偏离主题,但是,我懒得移动我的所有代码 onCreate to onStart ...对我来说是不好的做法,删除所有这些 听众,完成任务,调用完成()(或其他任何东西 杀掉一项活动,虽然我猜这不保证)并且只是从头开始重新创建活动? 它是一个简单的小应用程序,因此重新创建活动的开销 没什么大不了的。只是好奇什么是&#34;对&#34;。
  4. 我想这只是计划不周和缺乏知识的结果(我只是为了娱乐而不是为了工作而不幸)所以如果我必须采取艰难的路线,我认为这是一种学习经验,对吧?

1 个答案:

答案 0 :(得分:5)

当活动停止时自动取消注册侦听器是该类的一项功能&#34;任务&#34;在android及其派生类(StorageTask)中。

这意味着您可以执行以下操作:

UploadTask uploadTask = ref.putFile(uploadFile);

uploadTask.addOnFailureListener(thisActivity, new OnFailureListener() {
//@Override code here
}).addOnSuccessListener(thisActivity, new OnSuccessListener<UploadTask.TaskSnapshot>() {
//@Override code here
}).addOnProgressListner(thisActivity, new OnProgressListner<UploadTask.TaskSnapshot>() {
//@Override code here
};

您也可以使用实时数据库返回的Task对象(如setValue)执行此操作,如下所示:

databaseReference.setValue("newValue").addOnSuccessListener(thisActivity, ...)

所以直接回答你的问题:

  1. 使用活动范围版本在活动停止时自动取消注册侦听器。请注意,对于存储,您可以在活动开始时使用StorageReference.getActiveUploadTasks和StorageReference.getActiveDownloadTasks查询正在运行的操作并重新订阅。

  2. 如果使用范围内的侦听器,则不需要手动取消订阅。我不知道批量取消订阅非基于任务的侦听器的方法。

  3. 嗯,我不确定你怎么能保证操作系统总能杀死你的任务而不是再次停止/启动它 - 以及如何保证你的完成代码能够运行。我建议你将代码移到onStart