Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Firebase API和Android';用户的活动生命周期_Android_Firebase_Android Activity_Callback_Android Lifecycle - Fatal编程技术网

Firebase API和Android';用户的活动生命周期

Firebase API和Android';用户的活动生命周期,android,firebase,android-activity,callback,android-lifecycle,Android,Firebase,Android Activity,Callback,Android Lifecycle,Firebase API是围绕回调体系结构设计的。它充满了类似以下Firestore示例的结构(取自): db.集合(“城市”)文件(“DC”) 1.删除() .addOnSuccessListener(新的OnSuccessListener(){ @凌驾 成功时公开作废(作废避免){ Log.d(标记“DocumentSnapshot已成功删除!”); } }) .addOnFailureListener(新的OnFailureListener(){ @凌驾 public void onFai

Firebase API是围绕回调体系结构设计的。它充满了类似以下Firestore示例的结构(取自):

db.集合(“城市”)文件(“DC”)
1.删除()
.addOnSuccessListener(新的OnSuccessListener(){
@凌驾
成功时公开作废(作废避免){
Log.d(标记“DocumentSnapshot已成功删除!”);
}
})
.addOnFailureListener(新的OnFailureListener(){
@凌驾
public void onFailure(@NonNull异常e){
Log.w(标签“删除文件时出错”,e);
}
});
或此Firebase身份验证示例(来自):

AuthUI.getInstance()
.登出(本)
.addOnCompleteListener(新的OnCompleteListener(){
未完成的公共void(@NonNull任务){
// ...
}
});
谷歌自己的示例代码和应用程序中充满了这样的回调(通常被指定为对象的侦听器),总是直接在活动或片段中编码

对于iOS和web编程,这样一个基于回调的API非常好。这对安卓系统来说也不错,只是它似乎与谷歌自己关于处理活动(和片段)生命周期的指导相反。具体来说,对API方法的调用,如
delete()
signOut()
是异步操作的。作为侦听器传递的回调对象将被保留,直到相关任务完成并调用回调。如果在任务执行时销毁了活动(或片段),然后重新创建(例如,通过配置更改),则将在过时对象上调用回调。回调还保留对已销毁活动的引用,从而导致内存泄漏

我们应该如何处理这些回调?为了观察查询,谷歌建议使用
LiveData
对象(如中所示)。但是,对于许多Firebase任务(如上面的两个示例),使用
LiveData
没有多大意义。我们只是应该在保留片段或服务中对所有这些调用进行编码吗?这似乎不太可行。另一方面,这可能是唯一合理的做法(考虑到
任务
对象在添加侦听器后没有任何方法删除它们)。

使用时,如果您的工作应绑定到活动的生命周期,则应使用addOnCompleteListener、addOnSuccessListener、,和addOnFailureListener,它们接受活动参数作为第一个参数。执行此操作时,当活动停止时,回调将自动删除,并且回调对象不会泄漏(除非您做了其他错误)

对于我所了解的大多数任务实现,添加和删除这样的侦听器几乎没有成本,因为SDK将不会通过内部缓存结果来有效地复制工作


如果您的工作确实需要不断地被监听以获得结果,或者您不相信SDK在添加自动删除侦听器时会做正确的事情,那么来自体系结构的组件可以帮助您在整个生命周期的更改中保留工作。

LiveData一起使用的关键组件,帮助解决您描述的大部分问题是
ViewModel
(也在您链接的博客文章中引用)。你可能已经看过了,但也会推荐阅读
db.collection("cities").document("DC")
        .delete()
        .addOnSuccessListener(new OnSuccessListener<Void>() {
            @Override
            public void onSuccess(Void aVoid) {
                Log.d(TAG, "DocumentSnapshot successfully deleted!");
            }
        })
        .addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                Log.w(TAG, "Error deleting document", e);
            }
        });
AuthUI.getInstance()
    .signOut(this)
    .addOnCompleteListener(new OnCompleteListener<Void>() {
        public void onComplete(@NonNull Task<Void> task) {
            // ...
        }
    });