Return 任务完成时

Return when task is completed

我遇到了一个问题,但我不知道如何解决。

我正在使用 firebase firestore 为我检索一个确切的项目。这行得通。 当我希望任务在自定义 class 中重新调整该项目时,问题就来了。 由于 firebase firestore 任务是异步的,它在完成之前 return 为 null。

这是 DataAdapter class 中的代码:

public Data infoFile(int position){

    DocumentReference fileRef = getInfoFile(position); //Method that retrieves the document.

    //Array to set later the Data Object that will retrieve
    final Data[] dataArray = {new Data()};

    fileRef.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>()
    {
        @Override
        public void onComplete(@NonNull Task<DocumentSnapshot> task)
        {

            if(task.isSuccessful()){
                DocumentSnapshot documentSnapshot = task.getResult();

                if(documentSnapshot.exists()){

                    Data data = documentSnapshot.toObject(Data.class); //Get the data
                    dataArray[0] = data; //Set data
                    System.out.println("before put bundle" + dataArray[0].getName()); //This gets the data
                    //Can't return here.

                }
            }
        }
    }).addOnFailureListener(new OnFailureListener()
    {
        @Override
        public void onFailure(@NonNull Exception e)
        {

        }
    });
    System.out.println("before put bundle and almost return " + dataArray[0].getName());

    //This returns null because task isn't completed yet.  
    return dataArray[0];
}

我读过有关创建和接口,然后将数据传递给方法并接收它的内容。但我不知道如何 create/understand 。也许我错了,那行不通。

问题:任务完成后如何进入return数据模型?

最后一行 return 为空,因为它将在 onComplete() 完成之前执行。

另一方面,

onComplete() return 类型为 void 并且您不能 return 该函数中的值

您需要在调用 intoFile 函数的地方 class 创建一个函数

public void setData(Data data){
    //Set value and use
}

里面onComplete()

这样做

    @Override
    public void onComplete(@NonNull Task<DocumentSnapshot> task)
    {

        if(task.isSuccessful()){
            DocumentSnapshot documentSnapshot = task.getResult();

            if(documentSnapshot.exists()){

                Data data = documentSnapshot.toObject(Data.class); //Get the data
                dataArray[0] = data; //Set data
                System.out.println("before put bundle" + dataArray[0].getName()); //This gets the data
                setData(data)                }
        }
    }

设置值后,您可以从内部执行下一个操作 setData,或者您可以从 setData 调用一个函数来执行下一个操作,如下所示。

public void setData(Data data){
    this.data = data;
    executeNextTask(data);
}

这里你不能return数据因为你不知道数据什么时候准备好return所以你可以改变你调用这个函数的方法:

现在我想你使用的功能是:

Data d =  infoFile(position);
handleData(d);

将其更改为:

infoFile(position,new OnCompleteListener<DocumentSnapshot>()
    {
        @Override
        public void onComplete(@NonNull Task<DocumentSnapshot> task)
        {

            if(task.isSuccessful()){
                DocumentSnapshot documentSnapshot = task.getResult();

                if(documentSnapshot.exists()){

                    Data data = documentSnapshot.toObject(Data.class); //Get the data
                    dataArray[0] = data; //Set data
                    System.out.println("before put bundle" + dataArray[0].getName());   

                    //move the handling to here.
                    handleData(data);

                }
            }
        }
    }).addOnFailureListener(new OnFailureListener()
    {
        @Override
        public void onFailure(@NonNull Exception e)
        {

        }
    });

然后把函数改成:

public void infoFile(int position,OnCompleteListener<DocumentSnapshot> listener){

    DocumentReference fileRef = getInfoFile(position); //Method that retrieves the document.

    //Array to set later the Data Object that will retrieve
    final Data[] dataArray = {new Data()};

    fileRef.get().addOnCompleteListener(listener);
    System.out.println("before put bundle and almost return " + dataArray[0].getName());

}