我所知道的:当我将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 };
我认为这足以向你展示我的意思.这就是我的实际代码目前的结构.
问题:
>我是否需要删除所有这些侦听器以防万一
在此之前被终止(系统决定,电话死亡,等等)
回调发生了吗?
>我可以以某种方式将它们捆绑起来并立即将它们全部三个终止
因为我在我的代码中有30个这样的并且真的感觉不到
喜欢重组所有这些以分配所有这些听众
变量JUST所以我可以将它们传递给
“removeBlahBlahBlahListener(listenerVariable)”一遍又一遍.
>稍微偏离主题,但是,我懒得移动我的所有代码
onCreate to onStart …对我来说是不好的做法,删除所有这些
听众,完成任务,调用完成()(或其他任何东西
杀掉一项活动,虽然我猜这不保证)并且只是从头开始重新创建活动?
这是一个简单的小应用程序,因此重新创建活动的开销
没什么大不了的.只是好奇什么是“正确的”.
我想这只是计划不周和缺乏知识的结果(我只是为了娱乐而不是为了工作而不幸)所以如果我必须采取艰难的路线,我想这是一次学习经历,对吧?
解决方法
这意味着您可以执行以下操作:
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,...)
所以直接回答你的问题:
>使用活动范围版本在活动停止时自动取消注册侦听器.请注意,对于存储,您可以在活动开始时使用StorageReference.getActiveUploadTasks和StorageReference.getActiveDownloadTasks查询正在运行的操作并重新订阅.>如果使用作用域侦听器,则不需要手动取消订阅.我不知道批量取消订阅非基于任务的侦听器的方法.>嗯,我不确定你怎么能保证操作系统总是会杀死你的任务而不是再次停止/启动它 – 以及你的完成代码将如何保证运行.我建议你将代码移到onStart