java - Java 中的异步执行流程

标签 java multithreading asynchronous firebase-realtime-database

我正在编写一个方法,我想查询数据库并在查询完成后执行另一个方法。不过,由于对数据库的调用是异步的,我似乎无法弄清楚如何在数据库调用完成之前停止主要执行流程,如下所示:

public void getUserFromEmail(String email) {
    Firebase usersRef = rootRef.child("users");

    //Asynchronous database call, want to stop everything else 
    usersRef.orderByKey().equalTo(email).addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
        }

        @Override
        public void onCancelled(FirebaseError firebaseError) {
            System.out.println(firebaseError.getMessage());
        }
    });
    //Perform some more operations after database call is finished
}

我习惯于在 Nodejs 中使用异步回调,但我不知道在 Java 中是否有任何等效的控制执行流的方法。有什么简单的方法可以实现我想做的事情吗?

最佳答案

你无法停止主流程,主线程将继续运行。 (除非您以其他方式停止它,但这会导致“应用程序未响应”,所以不要这样做)。

只需在回调中执行操作即可。

public void getUserFromEmail(String email) {
    Firebase usersRef = rootRef.child("users");

    //Asynchronous database call, want to stop everything else 
    usersRef.orderByKey().equalTo(email).addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            // Perform some more operations after database call is finished
            // OR... callSomeMethod();
        }

        @Override
        public void onCancelled(FirebaseError firebaseError) {
            System.out.println(firebaseError.getMessage());
        }
    });

}

public void callSomeMethod() {
    // Perform some more operations after database call is finished
}

如果您有 Node 背景,那么这看起来可能很相似。将函数传递给 getUserFromEmail

public void otherMethod() {
    getUserFromEmail("steve@example.com", new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            // Perform some more operations after database call is finished
        }

        @Override
        public void onCancelled(FirebaseError firebaseError) {
            System.out.println(firebaseError.getMessage());
        }
    });
}

public void getUserFromEmail(String email, ValueEventListener listener) {
    rootRef.child("users")
        .orderByKey()
        .equalTo(email)
        .addListenerForSingleValueEvent(listener);
}

关于java - Java 中的异步执行流程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39985535/

相关文章:

java - Java 线程每秒常量 "ticks"

c# - .net 中的 Task.Delay 提前 125 毫秒触发

java - 异步网络服务流

java - 使用泛型和扩展抽象类

java - 将部分 Pixmap 上传到 GPU

java - 如何为 Ibatis SqlTemplateClientMap 创建自己的回调

wpf - 从 ViewModel 上的后台线程打开新窗口

java - 提高 JDBC 性能

asynchronous - F#如何运行几个异步任务并等待第一个完成的结果?

java - Jboss 中 list 主要属性的签名文件摘要无效