我在我的应用程序中放了一个按钮。当我按下按钮+1值保存到我的数据库。因此,我想检查按钮count =5
显示警报时的方法。当我单击按钮时,它会检查。当我的按钮count =5
警报显示3-4次时。但我想展示一次:(
以下是代码:
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);
}
答案 0 :(得分:1)
每次用户按下按钮时,您都会注册一个新的侦听器。如果初始值为3
,则用户必须按两次按钮才能将其转到5
。这意味着您的代码会注册两个侦听器,从而显示两个警报。
两种解决方案:
这是最简单的改变:我们将注册一个监听器:
唯一的变化是你如何注册听众:
ezzeearnRef.addListenerForSingleValueEvent(eventListener);
但是这仍然会为每次点击注册/取消注册一个监听器,这可能有点浪费。另外:如果你曾经让你的应用程序成为多用户,那么就会忽略其他用户也可能会增加计数器的事实。
尽可能在活动 - 生命周期方法中注册和注销您的侦听器。例如,在onStart
中注册侦听器并在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);
}
使用此代码,您的侦听器将在活动的生命周期中处于活动状态。在此期间,如果计数器(是或)变为5,则警报将显示一次。
答案 1 :(得分:0)
有时firebase会多次调用数据,因此您将获得超过一次的相同x值。修复此问题使用一个布尔变量来存储有关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);
}