java - 为什么我在 if 语句之外的返回值是 null?
问题描述
我想有人已经遇到过这个问题,但没有一个解决方案对我有用。这是背景。我正在查询 firestore 以查看文档中是否存在某个索引。如果是这样(因此下面的 if 语句),则返回同一文档中的一个字段。编辑:底部的工作代码
我尝试将返回值声明为全局、本地、最终值,但没有任何效果。
我正在记录结果并在哪里检查“项目图像 1:”我得到了我正在寻找的 url 字符串,但是当我再次检查“项目图像 2:”时,该值为空。当价值观相同时,怎么可能呢?
private String getImage(String classRestaurantId, final String menuItemName) {
CollectionReference restaurantQuery = firebaseFirestore.collection("Restaurant_Data").document(classRestaurantId).collection("Menu_Card");
restaurantQuery.get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
@Override
public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
for (QueryDocumentSnapshot menuDocument : queryDocumentSnapshots) {
if (menuDocument.getString("menuItemName").equals(menuItemName)) {
orderItemImage = menuDocument.getString("menuItemImage");
Log.d(TAG, "item image 1:"+ orderItemImage);
}
}
}
});
Log.d(TAG, "item image 2:"+ orderItemImage);
return orderItemImage;
}
这是我的 OnBindViewHolder:
public void onBindViewHolder(@NonNull final MealPlanDetailsAdapter.MealPlanDetailsViewHolder mpDetailsViewHolder, final int position) {
// Menu items
mpDetailsViewHolder.mealplanMenuRecycler.setHasFixedSize(true);
mpDetailsViewHolder.mealplanMenuRecycler.setLayoutManager(new LinearLayoutManager(adapterContext, LinearLayoutManager.HORIZONTAL, false));
String orderId = mealplanDetailsArrayList.get(position).getOrderDetails();
FirebaseUser firebaseUser = FirebaseAuth.getInstance().getCurrentUser();
if (firebaseUser != null) {
for (UserInfo profile : firebaseUser.getProviderData()) {
userId = profile.getUid();
}
}
// Get order details
final String restaurantId = mealplanDetailsArrayList.get(position).getRestaurantId();
CollectionReference orderReference = firebaseFirestore.collection("Customer_Data").document(userId).collection("Meal_Plans").document(orderId).collection("Placed_Order");
orderReference.get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
@Override
public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
mealplanMenuArrayList = new ArrayList<>();
for (QueryDocumentSnapshot orderDocument : queryDocumentSnapshots) {
// Get image
final String menuItemName = orderDocument.getString("menuItemName");
//String menuItemImage = getImage(restaurantId, menuItemName);
// Start of image collection
CollectionReference restaurantQuery = firebaseFirestore.collection("Restaurant_Data").document(restaurantId).collection("Menu_Card");
restaurantQuery.get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
@Override
public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
for (QueryDocumentSnapshot menuDocument : queryDocumentSnapshots) {
if (menuDocument.getString("menuItemName").equals(menuItemName)) {
orderItemImage = menuDocument.getString("menuItemImage");
Log.d(TAG, "item image 1:"+ orderItemImage);
}
}
}
});
// End of image collection
MealplanMenu mealplanMenu = new MealplanMenu(menuItemName, orderDocument.getString("menuItemQuantity"),orderItemImage);
mealplanMenuArrayList.add(mealplanMenu);
}
mealplanMenuAdapter = new MealplanMenuAdapter(adapterContext, mealplanMenuArrayList);
mpDetailsViewHolder.mealplanMenuRecycler.setAdapter(mealplanMenuAdapter);
}
});
}
这是来自 ElektroWeak 的最终工作代码。如果人们不是在寻找与从 Firestore 查询数据的嵌套回收器视图类似的解决方案,我会感到惊讶。
final String restaurantId = mealplanDetailsArrayList.get(position).getRestaurantId();
CollectionReference orderReference = firebaseFirestore.collection("Customer_Data").document(userId).collection("Meal_Plans").document(orderId).collection("Placed_Order");
orderReference.get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
@Override
public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
final ArrayList<MealplanMenu> mealplanMenuArrayList = new ArrayList<>();
for (QueryDocumentSnapshot orderDocument : queryDocumentSnapshots) {
// Get image
final String menuItemName = orderDocument.getString("menuItemName");
final String menuItemQuantity = orderDocument.getString("menuItemQuantity");
//String menuItemImage = getImage(restaurantId, menuItemName);
CollectionReference restaurantQuery = firebaseFirestore.collection("Restaurant_Data").document(restaurantId).collection("Menu_Card");
restaurantQuery.get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
@Override
public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
for (QueryDocumentSnapshot menuDocument : queryDocumentSnapshots) {
if (menuDocument.getString("menuItemName").equals(menuItemName)) {
String menuItemImage = menuDocument.getString("menuItemImage");
Log.d(TAG, "item image 1:"+ orderItemImage);
MealplanMenu mealplanMenu = new MealplanMenu(menuItemName, menuItemQuantity, menuItemImage);
mealplanMenuArrayList.add(mealplanMenu);
}
}
mealplanMenuAdapter = new MealplanMenuAdapter(adapterContext, mealplanMenuArrayList);
mpDetailsViewHolder.mealplanMenuRecycler.setAdapter(mealplanMenuAdapter);
}
});
// Log.d(TAG, "item image 2:"+ orderItemImage);
}
}
});
解决方案
restaurantQuery.get().addOnSuccessListener(...);
在这里,您正在向查询添加侦听器。这意味着addOnSuccessListener
将立即返回,但onSuccess
稍后会在查询在后台执行并返回结果时调用。因此,此代码将在onSuccess
调用之前执行:
Log.d(TAG, "item image 2:"+ orderItemImage);
return orderItemImage;
这意味着orderItemImage
仍然是null
因为它不是通过onSuccess
方法设置的。您可以放置取决于orderItemImage
内部onSuccess
方法的代码:
restaurantQuery.get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
@Override
public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
for (QueryDocumentSnapshot menuDocument : queryDocumentSnapshots) {
if (menuDocument.getString("menuItemName").equals(menuItemName)) {
orderItemImage = menuDocument.getString("menuItemImage");
Log.d(TAG, "item image 1:"+ orderItemImage);
// Place your code here, or call methods that depend on orderItemImage
}
}
}
});
编辑:
这两行取决于orderItemImage
,
MealplanMenu mealplanMenu = new MealplanMenu(menuItemName, orderDocument.getString("menuItemQuantity"),orderItemImage);
mealplanMenuArrayList.add(mealplanMenu);
因此您可以将它们放在里面onSuccess
以进行餐厅查询,并将适配器创建代码移到那里
CollectionReference restaurantQuery = firebaseFirestore.collection("Restaurant_Data").document(restaurantId).collection("Menu_Card");
restaurantQuery.get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
@Override
public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
for (QueryDocumentSnapshot menuDocument : queryDocumentSnapshots) {
if (menuDocument.getString("menuItemName").equals(menuItemName)) {
orderItemImage = menuDocument.getString("menuItemImage");
Log.d(TAG, "item image 1:"+ orderItemImage);
MealplanMenu mealplanMenu = new MealplanMenu(menuItemName, orderDocument.getString("menuItemQuantity"),orderItemImage);
mealplanMenuArrayList.add(mealplanMenu);
}
}
mealplanMenuAdapter = new MealplanMenuAdapter(adapterContext, mealplanMenuArrayList);
mpDetailsViewHolder.mealplanMenuRecycler.setAdapter(mealplanMenuAdapter);
}
});
推荐阅读
- c# - SQL 如何替换一个值
- python - 使用 python 和请求,如何进行正确的 POST 调用以及在哪里找到标头?
- android - FirebaseAppDistribution:appDistributionUpload gradle 命令中缺少应用程序 ID
- mysql - 跨列和行计算值的实例
- javascript - 使用 redux 钩子时使用 redux 操作的最佳选择是什么?
- sql - Impala 2.11:AnalysisException:选择列表中不支持子查询
- swift - 在 SwiftUI 中获取当前的经纬度
- c++ - 是否可以禁止一个类被动态转换为?
- git - Git - 将发布分支合并到主分支
- tensorflow - 任何想法如何解决激活函数的问题?