簡體   English   中英

任務完成返回

[英]Return when task is completed

我面臨一個問題,我不知道如何解決它。

我正在使用 firebase 火庫來檢索我一個確切的項目。 這行得通。 當我希望任務在自定義 class 中重新調整該項目時,問題就出現了。 由於 firebase firestore 任務是異步的,它在完成之前返回 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];
}

我已經閱讀了有關創建和接口,然后將數據傳遞給方法並接收它的信息。 但我不知道如何創建/理解它。 也許我錯了,那是行不通的。

問:任務完成后如何返回數據 model?

最后一行將返回 null 因為它將在onComplete()完成之前執行。

另一方面, onComplete()具有返回類型 void 並且您不能在該 function 中返回值

您需要在 class 中創建一個 function ,從中調用文件 function

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調用 function 執行類似這樣的下一個操作。

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

在這里您不能返回數據,因為您不知道數據何時准備好返回,因此您只需更改調用此 function 的方法:

現在我認為您使用的是 function:

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)
        {

        }
    });

然后將 function 更改為:

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

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM