函数启动,即使它没有被调用

时间:2018-03-18 06:43:46

标签: android firebase service

我的应用程序中有一个服务(当我选择一个插槽时触发)启动一个计时器,并在该计时器结束时(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");
            }
        });
    }

1 个答案:

答案 0 :(得分:0)

第二次没有调用方法database2(),而是onDataChange()。

这是因为你已经为数据库引用设置了一个值事件监听器,每次在那里发生值改变时都会调用它。

解决方案

使用addListenerForSingleValueEvent()代替addValueEventListener()