我做了一些合理的研究,找不到我需要的答案。
我所知道的事情:当我将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
};
我认为这足以向您展示我的意思。这就是我的实际代码目前的结构。
问题:
我想这只是计划不周和缺乏知识的结果(我只是为了娱乐而不是为了工作而不幸)所以如果我必须采取艰难的路线,我认为这是一种学习经验,对吧?
答案 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, ...)
所以直接回答你的问题:
使用活动范围版本在活动停止时自动取消注册侦听器。请注意,对于存储,您可以在活动开始时使用StorageReference.getActiveUploadTasks和StorageReference.getActiveDownloadTasks查询正在运行的操作并重新订阅。
如果使用范围内的侦听器,则不需要手动取消订阅。我不知道批量取消订阅非基于任务的侦听器的方法。
嗯,我不确定你怎么能保证操作系统总能杀死你的任务而不是再次停止/启动它 - 以及如何保证你的完成代码能够运行。我建议你将代码移到onStart