【问题标题】:Android - How to handle Firestore exceptions at user level?Android - 如何在用户级别处理 Firestore 异常?
【发布时间】:2019-01-28 00:56:54
【问题描述】:

我在我的应用程序中使用 Firestore,但我不知道如何在用户级别处理由此引发的异常。 (我的意思是在发生此类异常时向用户显示的内容)。

例如,要在 Firestore(DocumentReference#getDocumentReference#setDocumentReference#update)上执行任何 CRUD 操作,会返回一个 Task,它可能包含异常,但在文档中我找不到为什么 Firestore 可能会引发此异常。

除了简单地记录异常并显示诸如“发生错误,请稍后再试”之类的通用消息之外,我们还有什么更好的办法吗?

【问题讨论】:

    标签: java android firebase google-cloud-firestore


    【解决方案1】:

    您可以使用 Firestore 的 onFailureListener() 方法并在获取、设置或更新数据时获取错误。在这个例子中,我用它来设置数据:-

    firestore.collection("User").document(uid).set(user).addOnSuccessListener(this, new OnSuccessListener<Void>() {
            @Override
            public void onSuccess(Void aVoid)
            {
              //Data Saved Successfully
            }
        })
                .addOnFailureListener(this, new OnFailureListener() {
                    @Override
                    public void onFailure(Exception e)
                    {
                        //Toast error using method -> e.getMessage()
    
                    }
                });
    

    如果您想在 firebase 身份验证模块中捕获异常,请参考:- How to catch a Firebase Auth specific exceptions

    【讨论】:

    • 我错过了addOnSuccessListeneraddOnFailureListener,谢谢
    【解决方案2】:

    在有关getting data 的官方文档中,您可以像这样从task 对象中获取异常:

    docRef.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
        @Override
        public void onComplete(@NonNull Task<DocumentSnapshot> task) {
            if (task.isSuccessful()) {
                DocumentSnapshot document = task.getResult();
                if (document.exists()) {
                    Log.d(TAG, "DocumentSnapshot data: " + document.getData());
                } else {
                    Log.d(TAG, "No such document");
                }
            } else {
                //Log the error if the task is not successful
                Log.d(TAG, "get failed with ", task.getException());
            }
        }
    });
    

    请记住,当 Task 所代表的工作完成时,Task 就是 complete,而不管它的 successfailure。可能有也可能没有错误,你必须检查它。在订单方面,当任务所代表的工作按预期完成且没有错误时,该任务就是“成功”的。

    正如@Raj 在他的回答中提到的,您也可以使用addOnFailureListener,但请注意,如果网络连接丢失(用户设备上没有网络连接),onSuccess()onFailure() 都不会被触发.这种行为是有道理的,因为只有在 Firebase 服务器上提交(或拒绝)数据时,才认为任务已完成。 onComplete(Task&lt;T&gt; task) 方法也仅在任务完成时调用。所以在没有互联网连接的情况下,onComplete 也不会被触发。

    【讨论】:

    • 我已经更好地检查了 DocumentReference#get 方法的文档,它说如果无法从服务器或本地缓存中检索到文档,则任务可能会失败。所以,我知道如果网络连接丢失并且文档没有被缓存,onFailureListener/onCompleteListener 无论如何都会被调用,对吗?
    • 不!让我们举个例子。 OnSuccessListener 是一个接口。无法调用接口。可以改为调用的是该接口中存在的方法,在本例中为onSuccess() 方法。但是如果用户设备上没有网络连接,则不会触发onSuccess()onFailure()。仅当 Firebase 服务器提交(或拒绝)数据时才会调用其中一个,好吗?
    • 一切都好吗,我可以帮助您了解其他信息吗?
    • 因此,如果在这种情况下未调用这些回调(onSuccess()onFailure()),是否每次需要在 Firestore 中读取/写入数据时都需要检查网络连接?
    • 不,没有必要。每次没有互联网连接时,都会从缓存中读取数据。有一个解决方法,因此请查看我对此 post 的回答,了解如何使用 documentSnapshot.getMetadata().isFromCache().,查看您是从 Firebase 服务器还是从 Firebase 服务器读取数据。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-01
    • 2010-10-17
    • 1970-01-01
    • 2019-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多