Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Timeout when reading a value from firebase database?

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.

like image 982
Parag Kadam Avatar asked Sep 30 '26 00:09

Parag Kadam


1 Answers

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
    }
}
like image 159
Parag Kadam Avatar answered Oct 01 '26 14:10

Parag Kadam