Java中的异步执行流
我正在编写一个方法,其中我希望查询数据库,并在查询完成后执行另一个方法。但是,由于对数据库的调用是异步的,在数据库调用完成之前,我似乎不知道如何停止主执行流,如下所示:Java中的异步执行流,java,multithreading,asynchronous,firebase-realtime-database,Java,Multithreading,Asynchronous,Firebase Realtime Database,我正在编写一个方法,其中我希望查询数据库,并在查询完成后执行另一个方法。但是,由于对数据库的调用是异步的,在数据库调用完成之前,我似乎不知道如何停止主执行流,如下所示: public void getUserFromEmail(String email) { Firebase usersRef = rootRef.child("users"); //Asynchronous database call, want to stop everything else use
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
}
如果您来自节点背景,则可能与此类似。将函数传递到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);
}
如果真的想使用锁,可以控制流。例如,使用:
如果我想在回调完成后从原始meyhod返回一个值,该怎么办?方法是
void
。你不能回来。你也不应该。Async不能很好地处理return
语句您可以直接从上次我检查导致ANRs的回调中从dataSnapshot
获取的数据更新UI。如果在UI线程中执行我的更新,请参阅中的“我的更新”,然后选择“是”,否则选择“否”。添加到回答中,以警告人们从UI线程使用该方法。
public DataSnapshot getUserFromEmail(String email) throws InterruptedException {
AtomicReference<DataSnapshot> dataSnapshotRef = new AtomicReference<DataSnapshot>();
CountDownLatch completeSignal = new CountDownLatch(1);
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) {
dataSnapshotRef.set(dataSnapshot);
// Causes execution of the waiting thread to continue
// from the `await` call
completeSignal.countDown();
}
@Override
public void onCancelled(FirebaseError firebaseError) {
completeSignal.countDown();
}
});
// Execution on this thread pauses at the `await` call until
// countDown has been called from another thread.
completeSignal.await();
// Do stuff after onDataChanged or onCancelled has been called
DataSnapshot dataSnapshot = dataSnapshotRef.get();
}
public DataSnapshot getUserFromEmail(String email, ValueEventListener listener) {
Firebase usersRef = rootRef.child("users");
//Asynchronous database call, want to stop everything else
usersRef.orderByKey().equalTo(email).addListenerForSingleValueEvent(listener);
}
public void getUserAndThenDoSomething() {
getUserFromEmail("bob@example.com", new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
// Do stuff after getting the email here
}
@Override
public void onCancelled(FirebaseError firebaseError) {
}
});
}