user8884629
user8884629

Reputation:

Firebase Database retrieve data Issue

I have put a button in my App. When I press the button +1 value saves to my database. So I want to check a method that when the button count =5 show an alert.It checks when i click the button. When my button count =5 alert shows 3-4 times. But I want to show it for 1 time :(

Here is the code :

private void ButtonChecker(){
        DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
        DatabaseReference ezzeearnRef = rootRef.child(User1);
        ValueEventListener eventListener = new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {

                Long BRef1 = dataSnapshot.child("BRef").getValue(Long.class);
                assert BRef1 != null;
                int x = BRef1.intValue( );
                ref = x;
                if (x ==5){
                    showAlert("Don't CLick Button ");
                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        };
        ezzeearnRef.addValueEventListener(eventListener);
    }

Upvotes: 0

Views: 91

Answers (2)

Frank van Puffelen
Frank van Puffelen

Reputation: 598603

You're registering a new listener every time that the user presses the button. If the initial value is 3, the user has to press the button twice to get it to 5. That means your code registers two listeners and thus shows two alerts.

Two solutions:

  • Only register a listener once.
  • Register listeners that only get the current value.

Register listeners that only get the current value

This is the simplest change: we'll register a listener that:

  1. Reads the current value
  2. Automatically unregisters itself

The only change is how you register the listener:

ezzeearnRef.addListenerForSingleValueEvent(eventListener);

But this still registers/unregisters a listener for every click, which can be a bit wasteful. In addition: if you ever make your app multi-user, this misses the fact that other users may be incrementing the counter too.

Only register a listener once

Whenever possible, register and unregister your listeners in activity-lifecycle methods. For example, it is quite common to register the listeners in onStart and unregister them in onStop:

@Override
protected void onStart() {
    super.onStart();
    DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
    DatabaseReference ezzeearnRef = rootRef.child(User1);
    ValueEventListener eventListener = new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {

            Long BRef1 = dataSnapshot.child("BRef").getValue(Long.class);
            assert BRef1 != null;
            int x = BRef1.intValue( );
            ref = x;
            if (x ==5){
                showAlert("Don't CLick Button ");
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
            throw databaseError.toException(); // don't ignore errors
        }
    };
    ezzeearnRef.addValueEventListener(eventListener);
}

@Override
protected void onStop() {
    super.onStop();
    ezzeearnRef.removeEventListener(eventListener);
}

With this code your listener will be active during the lifecycle of the activity. During that time, if the counter (is or) becomes 5, the alert will show once.

Upvotes: 1

Shahadat Hossain Shaki
Shahadat Hossain Shaki

Reputation: 806

Sometime firebase call for data multiple time so you will get same x value more then one time. to fix this use a boolean variable which store value about alert.

 boolean isAlertShown = false;

private void ButtonChecker(){
    DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
    DatabaseReference ezzeearnRef = rootRef.child(User1);
    ValueEventListener eventListener = new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {

            Long BRef1 = dataSnapshot.child("BRef").getValue(Long.class);
            assert BRef1 != null;
            int x = BRef1.intValue( );
            ref = x;
            if (x ==5 && !isAlertShown){
                 isAlertShown = true;
                showAlert("Don't CLick Button ");
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    };
    ezzeearnRef.addValueEventListener(eventListener);
}

Upvotes: 0

Related Questions