Android - Firebase - 我需要删除每个监听器吗?

Android - Firebase - Do I need to remove EVERY single listener?

我做了相当多的研究,但找不到我需要的答案。

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

我不知道的是: 我还需要分离所有其他侦听器吗? (这包括 Firebase Database、Storage 和 Auth,我正在使用的三个 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. 我是否需要删除所有这些侦听器以防万一 activity 在此之前被终止(系统决定,phone 死亡,无论如何) 回调发生了吗?
  2. 我能以某种方式将它们捆绑在一起并同时终止所有三个吗 因为我的代码中有 30 个这样的东西而且真的感觉不到 比如重组所有这些以便分配所有这些听众 只是变量,这样我就可以将它们传递给 "removeBlahBlahBlahListener(listenerVariable)"一遍又一遍。
  3. 稍微跑题了,但是,我懒得把我所有的代码都从 onCreate to onStart ...对我来说删除所有这些是不好的做法 听众们,结束一切,调用 finish() (或其他任何东西) 杀死 activity,虽然我想这不能保证)然后从头开始重新创建 activity? 这是一个简单的小应用程序,因此重新创建 activity 的开销 没什么大不了的。只是好奇什么是 "right".

我想这只是计划不周和缺乏知识的结果(不幸的是,我编程只是为了乐趣,而不是为了工作)所以如果我不得不走艰难的道路,我想这是一种学习经历,对吧?

activity 停止时自动注销侦听器是 android 及其派生的 classes (StorageTask) 中 class "Task" 的一项功能。

这意味着您可以这样做:

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
};

您也可以使用从实时数据库返回的任务对象执行此操作,例如 setValue,如:

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

所以直接回答你的问题:

  1. 使用 activity 作用域版本在 activity 停止时自动注销侦听器。请注意,对于存储,您可以在 activity 开始使用 StorageReference.getActiveUploadTasks 和 StorageReference.getActiveDownloadTasks 并重新订阅时查询 运行ning 操作。

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

  3. 好吧,我不确定你如何保证 OS 将始终终止你的任务而不是再次 stopping/starting -- 以及你的完成代码将如何保证 运行。我建议您将代码移至 onStart