Firestore - 使用 CountDownLatch 等待任务完成 - 挂起应用程序
Firestore - using CountDownLatch to wait for task complete - hangs app
我对 CountDownLatch
有很大的疑问。我正在开发使用 Firestore
作为数据库的应用程序。我已经创建了一个用于管理数据库的文件,我想等待例如 writeSomethingToDb() 函数完成。我发现这个例子如何使用 CountDownLatch https://www.javaquery.com/2016/09/how-to-save-data-in-firebase.html ,它是实时数据库,但我猜它具有类似的功能。我写了我的代码,试图通过这个功能来保存一些东西,但应用程序只是挂起。
看起来它永远不会进入 OnComplete,但是如果没有 CountDownLatch,数据会正确添加到数据库中。
public void addSomethingToDb(FirestoreCollections collections, Object data) {
CountDownLatch countDownLatch = new CountDownLatch(1);
db.collection(collections.getName()).add(data).addOnCompleteListener(new OnCompleteListener<DocumentReference>() {
@Override
public void onComplete(@NonNull Task<DocumentReference> task) {
if(task.isSuccessful()){
Toast.makeText(context, String.valueOf(countDownLatch.getCount()), Toast.LENGTH_SHORT).show();
countDownLatch.countDown();
Toast.makeText(context, String.valueOf(countDownLatch.getCount()), Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(context, task.getException().getMessage(), Toast.LENGTH_SHORT).show();
}
}
});
try{
countDownLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
基本上,您正在尝试使用异步的 API 将数据同步添加到数据库。这不是一个好主意,因为您最终会阻塞您的线程。因此,您应该按预期异步处理 APIs。就像我的评论一样,为了解决这个问题,我建议你从这个 and for a better understanding, you can also take a look at this video .
中看到我的答案
我对 CountDownLatch
有很大的疑问。我正在开发使用 Firestore
作为数据库的应用程序。我已经创建了一个用于管理数据库的文件,我想等待例如 writeSomethingToDb() 函数完成。我发现这个例子如何使用 CountDownLatch https://www.javaquery.com/2016/09/how-to-save-data-in-firebase.html ,它是实时数据库,但我猜它具有类似的功能。我写了我的代码,试图通过这个功能来保存一些东西,但应用程序只是挂起。
看起来它永远不会进入 OnComplete,但是如果没有 CountDownLatch,数据会正确添加到数据库中。
public void addSomethingToDb(FirestoreCollections collections, Object data) {
CountDownLatch countDownLatch = new CountDownLatch(1);
db.collection(collections.getName()).add(data).addOnCompleteListener(new OnCompleteListener<DocumentReference>() {
@Override
public void onComplete(@NonNull Task<DocumentReference> task) {
if(task.isSuccessful()){
Toast.makeText(context, String.valueOf(countDownLatch.getCount()), Toast.LENGTH_SHORT).show();
countDownLatch.countDown();
Toast.makeText(context, String.valueOf(countDownLatch.getCount()), Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(context, task.getException().getMessage(), Toast.LENGTH_SHORT).show();
}
}
});
try{
countDownLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
基本上,您正在尝试使用异步的 API 将数据同步添加到数据库。这不是一个好主意,因为您最终会阻塞您的线程。因此,您应该按预期异步处理 APIs。就像我的评论一样,为了解决这个问题,我建议你从这个