如何在单独的 UI-Activity 中检索 Firebase 任务结果
How to retrieve Firebase Task Results in a separate UI-Activity
我目前正在试验使用 ML Kit 和本地 Firebase 框架来检测和分析人脸。
我有一个画廊 activity,用户可以在其中选择一张图片,然后被定向到另一个 activity,其中显示所选图片并分析人脸(我将代码简化以便问题更清楚):
private void classifyFaces(final Bitmap bitmap){
FirebaseVisionImage image = FirebaseVisionImage.fromBitmap(bitmap);
Task<List<FirebaseVisionFace>> result =
detector.detectInImage(image)
.addOnSuccessListener(
new OnSuccessListener<List<FirebaseVisionFace>>() {
@Override
public void onSuccess(List<FirebaseVisionFace> faces) {
// Task completed successfully
// Do face analysis tasks here.
})
.addOnFailureListener(
new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
// Task failed with an exception
// ...
}
});
}
如果此代码位于相应的 activity class 中,则它可以正常工作。然后,我将 classifyFaces 方法重写为 return 分析结果,并将其移至单独的包中。然后我从我的 activity 调用了新创建的 class 并且从未得到 return 值。
我认为这与 Firebase 任务的工作方式以及 classifyFaces 方法 returns 在 OnSuccessListener 被触发之前有关。
我尝试了不同的方法,例如将 DisplayImage activity 传递给 addOnSuccessListener 方法,但它没有用。
我该如何解决这个问题?
原因是Task是运行异步的。所以你的方法只是在它完成之前启动任务和 returns。
或许您可以将您的方法 return 设为任务。然后就可以在调用中注册onCompleteListener了activity。
我目前正在试验使用 ML Kit 和本地 Firebase 框架来检测和分析人脸。
我有一个画廊 activity,用户可以在其中选择一张图片,然后被定向到另一个 activity,其中显示所选图片并分析人脸(我将代码简化以便问题更清楚):
private void classifyFaces(final Bitmap bitmap){
FirebaseVisionImage image = FirebaseVisionImage.fromBitmap(bitmap);
Task<List<FirebaseVisionFace>> result =
detector.detectInImage(image)
.addOnSuccessListener(
new OnSuccessListener<List<FirebaseVisionFace>>() {
@Override
public void onSuccess(List<FirebaseVisionFace> faces) {
// Task completed successfully
// Do face analysis tasks here.
})
.addOnFailureListener(
new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
// Task failed with an exception
// ...
}
});
}
如果此代码位于相应的 activity class 中,则它可以正常工作。然后,我将 classifyFaces 方法重写为 return 分析结果,并将其移至单独的包中。然后我从我的 activity 调用了新创建的 class 并且从未得到 return 值。
我认为这与 Firebase 任务的工作方式以及 classifyFaces 方法 returns 在 OnSuccessListener 被触发之前有关。
我尝试了不同的方法,例如将 DisplayImage activity 传递给 addOnSuccessListener 方法,但它没有用。
我该如何解决这个问题?
原因是Task是运行异步的。所以你的方法只是在它完成之前启动任务和 returns。
或许您可以将您的方法 return 设为任务。然后就可以在调用中注册onCompleteListener了activity。