Android Firebase - “onDataChange” And “onCancelled” Not Being Called With No Internet Connection

后端 未结 2 615
情书的邮戳
情书的邮戳 2020-12-11 02:01

In my app, I simply try to retrieve a reading passage from my Firebase database by adding a ListenerForSingleValueEvent in the following code:

2条回答
  •  离开以前
    2020-12-11 02:49

    Hope that my solution can help somebody else (I assume that you already did something else)

    Besides to set the keepSynced to true in my database reference:

    databaseRef.keepSynced(true)
    

    And add to my Application class:

    FirebaseDatabase.getInstance().setPersistenceEnabled(true)
    

    I've added two listeners, one for offline mode and other one for online:

    override fun create(data: BaseObject): Observable {
        return Observable.create { observer ->
            val objectId = databaseRef.push().key
            objectId?.let { it ->
                data.id = it
    
                val valueEvent = object : ValueEventListener {
                    override fun onCancelled(e: DatabaseError) {
                        observer.onError(e.toException())
                    }
    
                    override fun onDataChange(dataSnapshot: DataSnapshot) {
                        observer.onComplete()
                    }
                }
                // This listener will be triggered if we try to push data without an internet connection
                databaseRef.addListenerForSingleValueEvent(valueEvent)
    
                // The following listeners will be triggered if we try to push data with an internet connection
                databaseRef.child(it)
                        .setValue(data)
                        .addOnCompleteListener {
                            observer.onComplete()
                            // If we are at this point we don't need the previous listener
                            databaseRef.removeEventListener(valueEvent)
                        }
                        .addOnFailureListener { e ->
                            if (!observer.isDisposed) {
                                observer.onError(e)
                            }
                            databaseRef.removeEventListener(valueEvent)
                        }
            } ?: observer.onError(FirebaseApiNotAvailableException("Cannot create new $reference Id"))
        }
    }
    

    To be honest, I don't like the idea to attach two listeners very much, if somebody else has a better and elegant solution, please let me know, I have this code temporarily until I find something better.

提交回复
热议问题