【问题标题】:Why this android function always return false?为什么这个android函数总是返回false?
【发布时间】:2019-05-20 04:15:24
【问题描述】:

我使用这个函数来检查特定日期是否存在于数据库中,但我每次都得到错误并且新日期也在数据库中更新

 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;
    }

【问题讨论】:

  • 因为你将字段设置为false,不要等待它被设置为其他任何东西。
  • 所以,因为我一开始就指定了 false ,所以值总是 false ?
  • 这是异步的:那些是事件处理程序;他们在dateCheck 完成后运行。我认为您目前对事件处理程序何时运行有点困惑。

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


【解决方案1】:

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

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

此问题的快速解决方案是仅在 onDataChange() 方法内使用您的布尔值 dateKey,否则我建议您从 post 中查看我的答案的最后一部分我已经解释了如何使用自定义回调来完成。您也可以看看这个 video 以获得更好的理解。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-31
    相关资源
    最近更新 更多