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
};
我认为这足以向您展示我的意思。这就是我的实际代码当前的结构。
问题:
- 我是否需要删除所有这些侦听器以防万一 activity
在此之前被终止(系统决定,phone 死亡,无论如何)
回调发生了吗?
- 我能以某种方式将它们捆绑在一起并同时终止所有三个吗
因为我的代码中有 30 个这样的东西而且真的感觉不到
比如重组所有这些以便分配所有这些听众
只是变量,这样我就可以将它们传递给
"removeBlahBlahBlahListener(listenerVariable)"一遍又一遍。
- 稍微跑题了,但是,我懒得把我所有的代码都从
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, ...)
所以直接回答你的问题:
使用 activity 作用域版本在 activity 停止时自动注销侦听器。请注意,对于存储,您可以在 activity 开始使用 StorageReference.getActiveUploadTasks 和 StorageReference.getActiveDownloadTasks 并重新订阅时查询 运行ning 操作。
如果使用范围侦听器,您不需要手动取消订阅。我不知道有什么方法可以批量取消订阅基于非任务的侦听器。
好吧,我不确定你如何保证 OS 将始终终止你的任务而不是再次 stopping/starting -- 以及你的完成代码将如何保证 运行。我建议您将代码移至 onStart
我做了相当多的研究,但找不到我需要的答案。
我所知道的: 当我将 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
};
我认为这足以向您展示我的意思。这就是我的实际代码当前的结构。
问题:
- 我是否需要删除所有这些侦听器以防万一 activity 在此之前被终止(系统决定,phone 死亡,无论如何) 回调发生了吗?
- 我能以某种方式将它们捆绑在一起并同时终止所有三个吗 因为我的代码中有 30 个这样的东西而且真的感觉不到 比如重组所有这些以便分配所有这些听众 只是变量,这样我就可以将它们传递给 "removeBlahBlahBlahListener(listenerVariable)"一遍又一遍。
- 稍微跑题了,但是,我懒得把我所有的代码都从 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, ...)
所以直接回答你的问题:
使用 activity 作用域版本在 activity 停止时自动注销侦听器。请注意,对于存储,您可以在 activity 开始使用 StorageReference.getActiveUploadTasks 和 StorageReference.getActiveDownloadTasks 并重新订阅时查询 运行ning 操作。
如果使用范围侦听器,您不需要手动取消订阅。我不知道有什么方法可以批量取消订阅基于非任务的侦听器。
好吧,我不确定你如何保证 OS 将始终终止你的任务而不是再次 stopping/starting -- 以及你的完成代码将如何保证 运行。我建议您将代码移至 onStart