How do you add a connection/read timeout when fetching data from firebase using addListenerForSingleValueEvent?
When I make a call for fetching data using addListenerForSingleValueEvent I make the ProgressBar visible and make the ProgressBar again invisible when the data is fetched in onDataChange or when some error occurs in onCancelled. But when there is no internet connection the ProgressBar remains visible forever because onDataChange or onCancelled never gets called. How do I make the ProgressBar invisible again? I think timeout is a good solution for this but I don't find anything like timeout in the firebase API ,if there is another way to solve this problem apart from timeout then please let me know. Thanks.
Since there is nothing like timeout in the Firebase API as @Doug Stevenson says, hence timeouts should be handled using our own logic. This is how i implemented timeout in my code.
private void getDataFromFirebase()
{
final boolean[] gotResult = new boolean[1];
gotResult[0] = false;
FirebaseDatabase firebaseDatabase = FirebaseDatabase.getInstance();
DatabaseReference dataReference = firebaseDatabase.getReference().child("data");
ValueEventListener dataFetchEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
gotResult[0] = true;
// You code goes here
}
@Override
public void onCancelled(DatabaseError databaseError) {
gotResult[0] = true;
}
};
if(isNetworkAvailable()) {
dataReference.addListenerForSingleValueEvent(dataFetchEventListener);
Timer timer = new Timer();
TimerTask timerTask = new TimerTask() {
@Override
public void run() {
timer.cancel();
if (gotResult[0] == false) { // Timeout
dataReference.removeEventListener(dataFetchEventListener);
// Your timeout code goes here
}
}
};
// Setting timeout of 10 sec to the request
timer.schedule(timerTask, 10000L);
}
else{
// Internet not available
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With