Android 如何在单独的UI活动中检索Firebase任务结果

Android 如何在单独的UI活动中检索Firebase任务结果,android,firebase,firebase-mlkit,Android,Firebase,Firebase Mlkit,我目前正在试验ML工具包和本地Firebase框架,用于检测和分析人脸 我有一个gallery活动,用户可以选择一个图像,并被引导到另一个活动,在该活动中显示选定的图像并分析人脸(我将代码浓缩,以便问题更清楚): private void classifyFaces(最终位图){ FirebaseVisionImage=FirebaseVisionImage.fromBitmap(位图); 任务结果= 检测器。检测图像(图像) .addOnSuccessListener( 新OnSuccessL

我目前正在试验ML工具包和本地Firebase框架,用于检测和分析人脸
我有一个gallery活动,用户可以选择一个图像,并被引导到另一个活动,在该活动中显示选定的图像并分析人脸(我将代码浓缩,以便问题更清楚):

private void classifyFaces(最终位图){
FirebaseVisionImage=FirebaseVisionImage.fromBitmap(位图);
任务结果=
检测器。检测图像(图像)
.addOnSuccessListener(
新OnSuccessListener(){
@凌驾
成功时的公共无效(列表面){
//任务已成功完成
//在这里做面部分析任务。
})
.addOnFailureListener(
新的OnFailureListener(){
@凌驾
public void onFailure(@NonNull异常e){
//任务失败,出现异常
// ...
}
});
}
如果此代码位于相应的activity类中,则可以正常工作。然后,我重写classifyFaces方法以返回分析结果,并将其移动到单独的包中。然后,我从activity调用了新创建的类,但从未获得返回值。

我认为这与Firebase任务的工作方式以及classifyFaces方法在OnSuccessListener启动之前返回有关。
我尝试了不同的方法,比如将DisplayImage活动传递给addOnSuccessListener方法,但没有成功。


如何修复此问题?

原因是任务正在异步运行。因此,您的方法只是启动任务并在任务完成之前返回

也许你可以让你的方法返回一个任务,然后你可以在调用活动中注册CompleteListener

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
                                    // ...
                                }
                            });
}