任务完成时返回

问题描述 投票:0回答:1

我正面临一个问题,但我不知道如何解决。

我正在使用Firebase Firestore检索我的确切物品。这可行。当我希望任务在自定义类中重新调优该项目时,就会出现问题。由于Firebase Firestore任务是异步的,因此它在完成之前会返回null。

这是DataAdapter类中的代码:

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];
}

我已经阅读了有关创建和接口,然后将数据传递给方法并进行接收的信息。但是我不知道该如何创建/理解。也许我错了,这不起作用。

问题:任务完成后如何返回数据模型?

java android firebase android-asynctask
1个回答
0
投票

最后一行将返回null,因为它将在onComplete()完成之前被执行。

[onComplete()另一方面具有返回类型void,并且您不能在该函数中返回值]

您需要在类中从调用inFile函数的位置创建一个函数

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

0
投票

在这里您不能返回数据,因为您不知道何时准备好返回数据,因此您只需更改调用此函数的方法即可:

现在我认为您使用的功能是:

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());

}
© www.soinside.com 2019 - 2024. All rights reserved.