Android- 在取值的 method/listener 之外使用变量值

Android- Using variable value outside method/listener where it takes value

我目前正在做一些学校 android 项目,我需要 help.I 具有在数据库侦听器中获取一些值的变量,我必须在 listener.Can 之外使用该值,你好帮助我找到正确初始化的方法并使用 variable.Thank 你 我的代码如下

 DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("user");
            ref.addListenerForSingleValueEvent(
                    new ValueEventListener() {
                        @Override
                        public void onDataChange(DataSnapshot dataSnapshot) {
                            //Get map of users in datasnapshot

                           names= getAllNames((Map<String,Object>) dataSnapshot.getValue());

                        }

                        @Override
                        public void onCancelled(DatabaseError databaseError) {
                            //handle databaseError
                        }
                    });
         String p=  names.get(1);

这个方法 getAllNames 工作正常,我测试了它。在这种情况下 P 为空,因为它在侦听器外部使用 f "names" 并且变量 "names" 是问题,但在侦听器中它显示正确的值.

这违背了异步的本质。

最好将下一个方法/逻辑链接到 onDataChange 而不是从外部访问它。

但是,您可以使用 Task

public Task<List<String>> getNames() {
TaskCompletionSource<String> task = new TaskCompletionSource<>();
DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("user");
            ref.addListenerForSingleValueEvent(
                    new ValueEventListener() {
                        @Override
                        public void onDataChange(DataSnapshot dataSnapshot) {
                            //Get map of users in datasnapshot

                           task.setResult(getAllNames((Map<String,Object>) dataSnapshot.getValue()));

                        }

                        @Override
                        public void onCancelled(DatabaseError databaseError) {
                            //handle databaseError
                            task.setException(new RuntimeException());
                        }
                    });
    return task.getTask()

}

现在在您的方法中重用它:

Task<List<String>> task = getNames();
List<String> names = Tasks.await(task); // This will block till done