[英]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.