为什么这个android函数总是返回false?

时间:2018-12-19 16:14:29

标签: java android firebase android-studio firebase-realtime-database

我正在使用此功能检查数据库中是否存在特定日期,但是每次都会出错,并且数据库中的新日期也会更新

 private boolean dateCheck() {
        dateKey = false;
        final ProgressDialog pg = new ProgressDialog(AdminMain.this);
        pg.setMessage("Validating Date");
        pg.setCanceledOnTouchOutside(false);
        pg.setCancelable(false);
        pg.show();
        final DatabaseReference dbDate = FirebaseDatabase.getInstance().getReference("Dates").child(batch).child(sem);
        dbDate.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                if (dataSnapshot.hasChild(date)) {
                    pg.dismiss();
                    Snackbar.make(findViewById(android.R.id.content), "Attendance has been already sumbitted", Snackbar.LENGTH_LONG).show();
                    dateKey = false;
                } else {
                    dateKey = true;
                    dbDate.child(date).setValue(true);
                    pg.dismiss();

                }
            }
            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
                Snackbar.make(findViewById(android.R.id.content), databaseError.getMessage(), Snackbar.LENGTH_SHORT).show();
                pg.dismiss();
                dateKey=false;
            }
        });

        return dateKey;
    }

1 个答案:

答案 0 :(得分:2)

作为方法的结果返回布尔值dateKey时,总是返回首先分配的值false。之所以发生这种情况,是因为返回该结果时尚未触发onDataChange()中存在的if语句,因此始终为false。因此,onDataChange()方法在调用后立即返回,并且它返回的Task中的回调将在一段时间后被调用。

不能保证需要多长时间。因此,可能需要几百毫秒到几秒钟的时间才能获得该数据。基本上,您试图从异步的API同步返回值。那不是一个好主意。您应该按预期异步处理API。

此问题的快速解决方案是仅在dateKey方法内使用布尔值onDataChange(),否则我建议您从此 {{3} } ,其中我解释了如何使用自定义回调来完成。您也可以查看此 post 以获得更好的理解。