我正面临一个问题,但我不知道如何解决。
我正在使用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];
}
我已经阅读了有关创建和接口,然后将数据传递给方法并进行接收的信息。但是我不知道该如何创建/理解。也许我错了,这不起作用。
问题:任务完成后如何返回数据模型?
最后一行将返回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);
}
在这里您不能返回数据,因为您不知道何时准备好返回数据,因此您只需更改调用此函数的方法即可:
现在我认为您使用的功能是:
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());
}