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());
}
我遇到了一个问题,但我不知道如何解决。
我正在使用 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());
}