我的应用程序中有一个服务(当我选择一个插槽时触发)启动一个计时器,并在该计时器结束时(onFinish())调用一个函数(称为database2),该函数将检查数据库是否为插槽传递给我的服务是“空置”,“占用”或“保留”。如果插槽是“保留”,它将把它改为空置。问题在于,在第二次保留相同的槽之后,功能数据库2自动检查槽是否是空的。它运行即使它还没有被调用。我使用共享首选项将插槽名称传递给将要保留的服务。
这是我的代码
服务中的计时器和数据库2:
public void DurationTimer(final String slot){
final long dur = 30000;
CountDownTimer countDownTimer = new CountDownTimer(dur,1000) {
@Override
public void onTick(long millisUntilFinished) {
long millis= millisUntilFinished;
String hms= String.format("%02d:%02d:%02d",
TimeUnit.MILLISECONDS.toHours(millis),
TimeUnit.MILLISECONDS.toMinutes(millis) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis))
//seconds
,TimeUnit.MILLISECONDS.toSeconds(millis) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis))
);
startForeground(uniqueID, buildForegroundNotification(hms));
database1();
}
@Override
public void onFinish() {
database2(slot);
Toast.makeText(TimerService.this, "onFinish", Toast.LENGTH_LONG).show();
long n[] = {1,5000};
v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
v.vibrate(n, -1);
endnotif();
}
};
countDownTimer.start();
}
database2功能:
public void database2 (final String slot)
{
DatabaseReference myRef = FirebaseDatabase.getInstance().getReference().child("parking_lot");
myRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot ds : dataSnapshot.getChildren()) {
final String key = ds.getKey();
DatabaseReference keyReference = FirebaseDatabase.getInstance().getReference().child("parking_lot").child(key);
keyReference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
String value = dataSnapshot.child("status").getValue(String.class);
if (key.equals(slot)) {
if (value.equals("occupied")) {
//Toast.makeText(TimerService.this,"occupied (service)"+slot,Toast.LENGTH_LONG).show();onDestroy();
} else if (value.equals("reserved")) {
Toast.makeText(TimerService.this,"vacate: "+slot,Toast.LENGTH_LONG).show();
database = FirebaseDatabase.getInstance();
final DatabaseReference myRef = database.getReference("parking_lot");
final DatabaseReference myRef1 = myRef.child(slot);
final DatabaseReference myRef2 = myRef1.child("status");
myRef2.setValue("vacant");
} else if (value.equals("vacant")) {
//Toast.makeText(TimerService.this,"vacant (service)"+slot,Toast.LENGTH_LONG).show();
}
}
Log.d(TAG, "Read ok");
}
@Override
public void onCancelled(DatabaseError databaseError) {
Log.d(TAG, "Read failed");
}
});
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
Log.d(TAG, "Read failed");
}
});
}
答案 0 :(得分:0)
第二次没有调用方法database2(),而是onDataChange()。
这是因为你已经为数据库引用设置了一个值事件监听器,每次在那里发生值改变时都会调用它。
使用addListenerForSingleValueEvent()
代替addValueEventListener()