Java 如何使用firebase在android studio中监听更改

Java 如何使用firebase在android studio中监听更改,java,android,firebase,listener,Java,Android,Firebase,Listener,我很难读取firebase上的更改。我试图做的是,当启动按钮被触发时,每次更改都会显示一个对话框,上面写着:“这已经执行了。” 我尝试使用addListenerForSingleValueEvent,但似乎只有在所有子项都已更改时才会显示该对话框 startBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) {

我很难读取firebase上的更改。我试图做的是,当启动按钮被触发时,每次更改都会显示一个对话框,上面写着:“这已经执行了。”

我尝试使用addListenerForSingleValueEvent,但似乎只有在所有子项都已更改时才会显示该对话框

 startBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            currentWeek = programTrackers.get(0).getWeek();
            DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference("ProgramTracker")
                    .child(GlobalUser.getmUser().getiD())
                    .child(programTrackers.get(0).getProgramId());
            databaseReference.addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    final int childCount = (int) dataSnapshot.getChildrenCount();
                    int count = 0;
                    for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                        ProgramTracker programTracker = snapshot.getValue(ProgramTracker.class);
                        if (programTracker.getProgramExerciseWeek() == currentWeek) {
                            programTrackChecker.add(programTracker);


                        }
                        count++;
                    }
                    if (count == childCount) {
                        boolean isFinished = false;
                        //last iteration
                        for (int i = 0; i < programTrackChecker.size(); i++) {
                            if (programTrackChecker.get(i).isProgramExerciseFinished()) {
                                isFinished = true;
                            } else
                                isFinished = false;
                        }
                        if (isFinished) {
                            AlertDialog.Builder builder = new AlertDialog.Builder(DayExerciseActivity.this);
                            builder.setMessage("You have already completed all exercises. Are you sure you want to do it again?");
                            builder.setPositiveButton("Yes", (dialogInterface, i) -> {
                                startActivity(new Intent(DayExerciseActivity.this, DoProgramActivity.class)
                                        .putExtra("programTrackers", programTrackers)
                                        .putExtra("exerciseNum", String.valueOf(0)));

                            });
                            builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialogInterface, int i) {
                                    dialogInterface.dismiss();
                                }
                            });
                            builder.show();


                        } else
                            startActivity(new Intent(DayExerciseActivity.this, DoProgramActivity.class)
                                    .putExtra("programTrackers", programTrackers)
                                    .putExtra("exerciseNum", String.valueOf(0)));

                    }

                }

                @Override
                public void onCancelled(DatabaseError databaseError) {

                }
            });
startBtn.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
currentWeek=programTrackers.get(0.getWeek();
DatabaseReference DatabaseReference=FirebaseDatabase.getInstance().getReference(“ProgramTracker”)
.child(GlobalUser.getmUser().getiD())
.child(programTrackers.get(0.getProgramId());
databaseReference.addListenerForSingleValueEvent(新的ValueEventListener()){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
final int childCount=(int)dataSnapshot.getChildrenCount();
整数计数=0;
对于(DataSnapshot快照:DataSnapshot.getChildren()){
ProgramTracker ProgramTracker=snapshot.getValue(ProgramTracker.class);
如果(programTracker.getProgramExerciseWeek()==currentWeek){
programTrackChecker.add(programTracker);
}
计数++;
}
if(count==childCount){
布尔值isFinished=false;
//最后一次迭代
对于(int i=0;i{
startActivity(新意图(DayExerciseActivity.this、DoProgramActivity.class)
.putExtra(“程序跟踪器”,程序跟踪器)
.putExtra(“exerciseNum”,String.valueOf(0));
});
setNegativeButton(“取消”,新建DialogInterface.OnClickListener()){
@凌驾
公共void onClick(DialogInterface,inti){
dialogInterface.dismise();
}
});
builder.show();
}否则
startActivity(新意图(DayExerciseActivity.this、DoProgramActivity.class)
.putExtra(“程序跟踪器”,程序跟踪器)
.putExtra(“exerciseNum”,String.valueOf(0));
}
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){
}
});

您需要更改以下内容:

databaseReference.addListenerForSingleValueEvent(new ValueEventListener
为此:

databaseReference.addValueEventListener(new ValueEventListener
从文档中:

public abstract void onDataChange(DataSnapshot快照)

将使用此位置的数据快照调用此方法。每次数据更改时也将调用此方法


如果答案对您有帮助,请将其更新并标记为正确,以便其他用户知道它是有帮助的!不幸的是,它不起作用。我将其更改为addValueEventListener
addValueEventListener
将继续侦听更改,因此,如果您从控制台向数据库添加新数据,例如,它将检索新的da助教。。