Android-在方法/监听器之外使用变量值,它取值

时间:2018-06-02 15:16:19

标签: java android firebase listener

我目前正在做一些学校的android项目,我需要帮助。我有变量在数据库监听器中占用一些值,我必须在监听器之外使用该值。你能帮我找到正确初始化和使用的方法那个变数。谢谢 我的代码在

之下
 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是null,因为它使用的是&#34;名称&#34;外部听众和变量&#34;名称&#34;是问题,但在听众中它显示正确的价值。

1 个答案:

答案 0 :(得分:0)

这违反了异步的本质。

如果你在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