[android]Firebase 阅读问题。对象总是空

发布时间: 2017/3/19 14:52:44
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我有一个方法,应该初始化我字段变量 currentTask 。我不明白为什么我不能读我的对象从 firebase 。这里是的方法︰

private void getCurrentTask() {
    final DatabaseReference dRef1 = database.getReference().child("Users").child(uid).child("CurrentTask");
    dRef1.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            if (dataSnapshot.exists()) {
                currentTask = dataSnapshot.getValue(CurrentTask.class);
            } else {
                    Toast toast = Toast.makeText(TasksListActivity.this, "no magic", Toast.LENGTH_LONG);
                    toast.show();
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {}
    });

    if (currentTask == null) {
        Toast toast = Toast.makeText(this, "magic)", Toast.LENGTH_LONG);
        toast.show();
    }
}

Toastno magic从来没有出现,所以该对象存在。但是,在方法的末尾, toast magic 出现,这就意味着 currentTask == null 。即使后初始化 !

这里是我的数据库︰

enter image description here

解决方法 1:

@Roasario@ReazMurshed答案是两者都正确。但让我通过描述如何您的代码不工作,因为你预期使其更简单︰

private void getCurrentTask() {
    ...
    dRef1.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            ... (point 1)
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {}
    });

    ... (point 2)
}

Firebase数据库加载您的数据 asyncronously。这意味着 (要简单), process 的数据不会干扰你的主要 process 。这一点,在代码 (point 2) 不总是执行后的代码 (point 1) ,反之亦然。虽然通常代码在 (point 1) 后执行 (point 2) ,它不是总是这样。因此,你应该考虑,所编写的代码 (point 1) 可以在任何时候执行。

然后你应该写您的代码与这一概念。意味着,如果你想要做什么给内部变量 (point 1) (像填充 currentTask 与 dataSnapshot 值然后检查如果它为 null),你应该把它放所有美好的感觉(point 1)

希望这种帮助。

官方微信
官方QQ群
31647020