java - 等待两个异步 firebase ml 视觉方法结果以在第三种方法中使用它们的最佳方法
问题描述
使用 firebase ml vision 识别图像中的二维码和/或文本时。等待异步文本和条形码检测器方法解决的最佳方法是什么,以便我可以在第三种方法中利用它们的结果。
我知道我可以从每个异步方法“onsuccess”侦听器中调用一个替代方法来设置一个“hasReturned”变量,并且只有在两种方法都返回后才继续,但我正在寻找正确的方法来做到这一点。
private void firebaseRecognitionFromImage(FirebaseVisionImage image) {
//detect qr code
FirebaseVisionBarcodeDetectorOptions options = new FirebaseVisionBarcodeDetectorOptions.Builder().setBarcodeFormats(FirebaseVisionBarcode.FORMAT_ALL_FORMATS).build();
FirebaseVisionBarcodeDetector qrDetector = FirebaseVision.getInstance().getVisionBarcodeDetector(options);
qrDetector.detectInImage(image).addOnSuccessListener(new OnSuccessListener<List<FirebaseVisionBarcode>>() {
@Override
public void onSuccess(List<FirebaseVisionBarcode> barcodes) { /* RESULT 1 */ }
});
//detect text
FirebaseVisionTextRecognizer textDetector = FirebaseVision.getInstance().getOnDeviceTextRecognizer();
textDetector.processImage(image).addOnSuccessListener(new OnSuccessListener<FirebaseVisionText>() {
@Override
public void onSuccess(FirebaseVisionText texts) { /* RESULT 2 */ }
});
//process qr code and text information or lack thereof
thirdMedthod("RESULT 1", "RESULT 2");
}
解决方案
您应该使用Tasks.whenAll()
. 它将创建一个新的 Task 对象,该对象在其他任务完成时完成。
Task<List<FirebaseVisionBarcode>> t1 = qrDetector.detectInImage(image);
Task<FirebaseVisionText> t2 = textDetector.processImage(image);
Tasks.whenAll(t1, t2).addOnSuccessListener(new OnSuccessListener<Void>() {
// check the results of t1 and t2
});
在此博客系列中了解有关Play Services Tasks API的更多信息。
推荐阅读
- java - 如何将java类字段转换为字符串值数组
- c++ - 如何比在 C++ 中使用 qsort 更快地对一百万个数字进行分组?
- hadoop - 如何从hadoop将数据导出到大型机
- c# - 将数据从数据库拖到列表框
- java - 为什么特定 Guava Stopwatch.elapsed() 调用比其他调用晚得多?(在帖子中输出)
- database - 我在哪里可以找到一些示例价目表数据库?
- python - 如何在 sphinx 中更改 pybtex 引用的样式
- .net - 为什么 CORS 不适用于此配置?
- excel - 如何根据 Excel 中的 ID 列复制和同步表?
- excel - “this”表上的单元格具有“that”表上的单元格的单元格地址。我正在尝试更改“那个”表上单元格的内容