2 回答
TA贡献1883条经验 获得超3个赞
数据从 Firestore 异步加载,因为它可能必须从服务器检索。为防止阻止应用程序,主要代码在检索数据时继续执行。然后,当数据可用时,您onComplete会被调用。
这意味着任何需要数据中的数据的代码都必须在方法内部onComplete,或者从那里调用。所以像:
docrefprodotti.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
@Override
public void onComplete(@NonNull Task<DocumentSnapshot> task) {
if (task.isSuccessful()) {
DocumentSnapshot document = task.getResult();
if (document.exists()) {
Prodotti prod=document.toObject(Prodotti.class);
prod.id=codiceProdottoScannerizzato;
prod.totalePezziCarrello=1;
carrelloAttuale.prodotti.add(prod);
Log.d(TAG, "PRODOTTO: " + prod.toString());
} else {
Log.d(TAG, "No such document");
}
} else {
Log.d(TAG, "get failed with ", task.getException());
}
Log.d(TAG, "CARRELLO FB: " + carrelloAttuale.size());
transaction.update(docRef, "prodotti", carrelloAttuale.getProdotti());
}
});
TA贡献1853条经验 获得超6个赞
“命令更新”在调用“carrelloAttuale.prodotti.add(prod)”之前执行,因为该onComplete()
方法具有异步行为并立即返回。这意味着在数据库更新操作完成之后的某个时间之后,侦听器才会被调用。无法保证需要多长时间。根据您的连接速度和状态,更新操作可能需要几百毫秒到几秒才能完成。
如果您想对该数据使用某些逻辑,则必须等到异步 Firebase 数据库操作完成。这意味着您只能使用prod
侦听器回调本身内部的对象。
添加回答
举报