Java 为什么我的返回值在if语句之外为null?

Java 为什么我的返回值在if语句之外为null?,java,android,Java,Android,我想可能有人已经遇到了这个问题,但没有一个解决方案对我有效。以下是背景。我正在查询firestore,以查看文档中是否存在某个索引。如果它执行了下面的If语句,则返回同一文档中的一个字段。编辑:底部的工作代码 我已尝试将返回值声明为全局、局部、最终,但没有任何效果 我正在记录结果,并在其中检查项目图像1:我得到了我要查找的url字符串,但当我再次检查项目图像2时:该值为空。当值相同时,这怎么可能呢 private String getImage(String classRestaurantId,

我想可能有人已经遇到了这个问题,但没有一个解决方案对我有效。以下是背景。我正在查询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);
                }
            }
        });
在这里,您将向查询添加一个侦听器。这意味着addOnSuccessListener将立即返回,但稍后在后台执行查询并返回结果时将调用onSuccess。因此,将在调用onSuccess之前执行此代码:

Log.d(TAG, "item image 2:"+ orderItemImage);
return orderItemImage;
这意味着orderItemImage仍然为空,因为它不是由onSuccess方法设置的。您可以将依赖于orderItemImage的代码放在onSuccess方法中:

所以您可以将它们放在onSuccess for restaurant query中,也可以将适配器创建代码移到那里

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);
    }
});

我无法将代码放在其中,因为我正在这里未显示的onCreate方法中查询另一个firestore集合。因此,我必须调用此方法来获取我提到的字符串。问题是调用onSuccess之前可能需要一些时间,这意味着您需要阻塞线程,直到它执行为止,这将导致冻结和无响应的UI(假设您是从UI线程调用)。你能发布你的onCreate方法吗?我添加了onCreate。它实际上是回收器视图适配器中的OnBindViewHolder。我还附加了代码,以显示如果我将该方法添加到主体中会是什么样子。正如您可能知道的,我在垂直中使用嵌套的水平回收器,根据我触发水平适配器的位置,水平回收器从不调用,或者每个水平适配器的所有项目在垂直回收器中的每个项目中重复。这就是为什么我想使用一种方法将回收器/适配器设置与查询所需的映像分开。您缺少基本的编程概念。你不能从这样的回调中返回值。我不是一个专业的开发人员,我已经编写了不到一年的代码。我知道其他人在说什么,但我不知道如何实现它,我也不知道退后一步应该是什么。。。然后转到这些教程的顶部索引,并决定要刷新的其他基本主题。提示:当你想回复一条评论时,请使用@username!我试着使用@,但我一次只能使用@1个用户,评论是针对你们两个的。
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
            }
        }
    }
});
MealplanMenu mealplanMenu = new MealplanMenu(menuItemName, orderDocument.getString("menuItemQuantity"),orderItemImage);
mealplanMenuArrayList.add(mealplanMenu);
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);
    }
});