18

In my app, I am using Firebase for database. Now when I am listening for any change in child nodes of a particular location, and if there is no internet connection, no callback gets fired. The firebase call just gets stuck.

I am using this,

FirebaseDatabase firebaseDatabase = FirebaseDatabase.getInstance();
firebaseDatabase.setPersistenceEnabled(true);

So, persistence is enabled. The problem occurs only one one scenario. When there is no data on the local persistence of Firebase and the internet connection is also not available.

I am using this,

addListenerForSingleValueEvent(new ValueEventListener() {
                        @Override
                        public void onDataChange(DataSnapshot dataSnapshot) {

                        }

                        @Override
                        public void onCancelled(DatabaseError databaseError) {
                            Timber.d("Cancelled");
                        }
                    });

I am not getting any of the two callbacks for that particular scenario.

What should I do to tackle this kind of scenario?

Aritra Roy
  • 15,355
  • 10
  • 73
  • 107
  • I'm actually experiencing this same problem right now. Did you do anything to solve it? If not, then I might have to resort to their REST API. – Rafi Aug 18 '16 at 14:33
  • What SDK version are you using for Firebase? – Aritra Roy Aug 18 '16 at 15:38
  • 1
    I ended up solving the issue by using the information I got from this answer: http://stackoverflow.com/questions/39021378/android-firebase-ondatachange-and-oncancelled-not-being-called-with-no-int/39021671#39021671 – Rafi Aug 18 '16 at 17:59
  • 2
    Thanks. It would be great if you can put your solution as an answer. Can be helpful for everyone else. – Aritra Roy Aug 19 '16 at 16:34

1 Answers1

9

Let's see how those methods are triggered when there is no connectivity:

onCancelled - when there is a server-side error. For example, when the user doesn't have access to the specified node. (Or when you reach the connection limit on the Sparkle plan).

onDataChange - if there is data persisted, it will read this data. If not, this method won't be triggered (your case).

According to the Firebase Documentation, If you want to check if the device is connected to the Firebase Server, you can add a listener to .info/connected. Like this:

DatabaseReference connectedRef = FirebaseDatabase.getInstance().getReference(".info/connected");
connectedRef.addValueEventListener(new ValueEventListener() {
  @Override
  public void onDataChange(DataSnapshot snapshot) {
    boolean connected = snapshot.getValue(Boolean.class);
    if (connected) {
      Toast.makeText(this, "Connected", Toask.LENGTH_SHORT);
    } else {
      Toast.makeText(this, "Not connected", Toask.LENGTH_SHORT).show();
    }
  }

  @Override
  public void onCancelled(DatabaseError error) {
  }
});