Multithreading 如何将firebase中的值存储在全局变量中?

Multithreading 如何将firebase中的值存储在全局变量中?,multithreading,firebase,firebase-realtime-database,Multithreading,Firebase,Firebase Realtime Database,我试图从Firebase数据库中读取一个值,并将其分配给一个全局变量。但是,变量似乎总是空的。我检查了很多论坛,他们都说我需要附加一个“回调”,因为这是一个异步任务。有人能帮我弄清楚确切的密码吗 getServerTime.setValue(ServerValue.TIMESTAMP).addOnCompleteListener(new OnCompleteListener<Void>() { @Override pub

我试图从Firebase数据库中读取一个值,并将其分配给一个全局变量。但是,变量似乎总是空的。我检查了很多论坛,他们都说我需要附加一个“回调”,因为这是一个异步任务。有人能帮我弄清楚确切的密码吗

getServerTime.setValue(ServerValue.TIMESTAMP).addOnCompleteListener(new OnCompleteListener<Void>() {
                @Override
                public void onComplete(@NonNull Task<Void> task) {

                    system_time = System.currentTimeMillis();
                    getServerTime.addListenerForSingleValueEvent(new ValueEventListener() {
                        @Override
                        public void onDataChange(DataSnapshot dataSnapshot) {
                            server_time_long = dataSnapshot.getValue(Long.class);




                        }

                        @Override
                        public void onCancelled(DatabaseError databaseError) {

                        }
                    });

          t1.setText(String.valueOf(server_time_long));
                }
            });
getServerTime.setValue(ServerValue.TIMESTAMP).addOnCompleteListener(新的OnCompleteListener(){
@凌驾
未完成的公共void(@NonNull任务){
system_time=system.currentTimeMillis();
getServerTime.addListenerForSingleValueEvent(新值EventListener()){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
server\u time\u long=dataSnapshot.getValue(long.class);
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){
}
});
t1.setText(String.valueOf(server_time_long));
}
});

无法将从Firebase数据库获得的值存储在全局变量中,因为
onDataChange()
方法称为
异步
。这意味着在您试图从数据库获取数据之前会调用
setText()
方法,这就是为什么总是
null

要解决此问题,您需要移动这行代码:

t1.setText(String.valueOf(server_time_long));
内部
onDataChange()
方法。可以这样做:

getServerTime.setValue(ServerValue.TIMESTAMP).addOnCompleteListener(new OnCompleteListener<Void>() {
            @Override
            public void onComplete(@NonNull Task<Void> task) {

                system_time = System.currentTimeMillis();
                getServerTime.addListenerForSingleValueEvent(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
                        long server_time_long = dataSnapshot.getValue(Long.class);
                        t1.setText(String.valueOf(server_time_long));
                    }

                    @Override
                    public void onCancelled(DatabaseError databaseError) {}
                });
            }
        });
getServerTime.setValue(ServerValue.TIMESTAMP).addOnCompleteListener(新的OnCompleteListener(){
@凌驾
未完成的公共void(@NonNull任务){
system_time=system.currentTimeMillis();
getServerTime.addListenerForSingleValueEvent(新值EventListener()){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
long server\u time\u long=dataSnapshot.getValue(long.class);
t1.setText(String.valueOf(server_time_long));
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){}
});
}
});

如果您想在该方法之外使用该值,我建议您从中查看我的答案。

如果您需要外部数据,则只需按照该答案中解释的步骤进行操作。感谢您的回答!是的,我确实需要在该方法之外使用该值。我刚刚检查了你的另一个答案,我有几个问题(我对Android非常陌生,所以请耐心听我说):1)你到底从哪里调用数据?比如,你能给我一个更有针对性的回答吗?2) 它说我需要在new database()中声明“database”。mRead。我怎么定义它呢?1)你可以在你需要的地方准确地调用这些数据。2) 你需要遵循的步骤(其中3个)在那篇文章中进行了解释。3) 是的,您需要创建一个新的
Database
对象才能实现这一点。显然,Firebase不允许从3.0版本创建数据库对象。我应该使用databaseReference还是FirebaseDatabase?如果是这样,语法将如何更改?如果我的数据库的URL是“”,您将如何编写代码?谢谢另外,我应该输入什么作为“child”的字符串?包含我的servertime值的子级的名称?