首页 > 解决方案 > 未定义的标签:firestore 内的 loop3

问题描述

当查询内部满足条件时,我想打破外部循环firestore

loopLebel:
for (int i = 10; i > 0; i++) {
    query.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
        @Override
        public void onComplete(@NonNull Task<QuerySnapshot> task) {
            if (task.isSuccessful()) {
                loop1:
                for (QueryDocumentSnapshot queryDocumentSnapshot : Objects.requireNonNull(task.getResult())) {
                    if (queryDocumentSnapshot.getString("Name").equals(list.get(finalI1).name)) {
                        HospitalData data = new HospitalData(list.get(finalI1).name, numberFormat.format(distanceKilometer), list.get(finalI1).rating.toString() + "/5.0", true, list.get(finalI1).latitude, list.get(finalI1).longitude);
                        hospitalDataList.add(data);
                        break loopLebel;
                    }
                }
            }
            RecyclerView recyclerView = findViewById(R.id.recycler_view);
            HospitalAdapter hospitalAdapter = new HospitalAdapter((ArrayList<HospitalData>) hospitalDataList, HospitalListActivity.this);
            RecyclerView.LayoutManager manager = new LinearLayoutManager(HospitalListActivity.this);
            recyclerView.setLayoutManager(manager);
            recyclerView.setAdapter(hospitalAdapter);
            hospitalAdapter.notifyDataSetChanged();
        }
    });
}

该代码正在生成以下错误消息:

错误:未定义标签:loopLebel

在查询之外,loopLebel标签被识别,但在查询内部,loopLebel标签无法识别。

标签: javaandroidfor-loopgoogle-cloud-firestorebreak

解决方案


当您在 内构造新OnCompleteListener<QuerySnapshot>实例loop2时,该onComplete(@NonNull Task<QuerySnapshot> task)方法的当前实现将不再loop3在范围内具有外部代码 ( ),这就是您看到undefined label: loop3错误消息的原因。

要解决此问题,您可以采取以下步骤(根据需要进行调整以满足您的特定目标/要求):

  1. 删除loop3标签使用

  2. 在其位置定义一个标志变量

  3. 引用内部的外部标志变量OnCompleteListener<QuerySnapshot>

  4. 在内部范围内设置标志变量的值 ( loop1)

  5. 在外部范围 ( loop3) 中添加标志检查并相应地中断:

    
    // Step 1 & Step 2:
    boolean loopThreeFlag = false;
    for (/* ... */) {
        //...
        query.get().addOnCompleteListener(
            new OnCompleteListener() {
                @Override
                public void onComplete(@NonNull Task task) {
                    //...
                    if (queryDocumentSnapshot.getString("Name")
                        .equals(list.get(finalI1).name)) {
                            //...
                            // Step 3 & Step 4:
                            OuterScopeClass.this.loopThreeFlag = true;
                    }
                }
            }
            //...
        });
        //Step 5:
        if (loopThreeFlag) {
            break; //no label required
        }
    }
    

推荐阅读