Firebase / GeoQuery - 最大半径 IF 语句

Firebase / GeoQuery - Maximum Radius IF Statement

所以我已经尝试了一段时间来实现一种方法,如果没有找到商人或者最大半径内没有商人,我可以更新用户。因此,该应用基本上是在 Firebase 中搜索可用的商人,并根据他们的纬度和经度与最近的商人进行匹配。如果在 1 英里内发现 none,则它会增加到 2,依此类推。

我一直在努力实现的是一种方式来说明火力基地内是否没有可用的商人,或者如果在一定半径内没有可用的商人,那么一旦它增加说 10 英里停止并且 return 没有找到商人。

这是我现在拥有的代码,用于搜索商人并增加半径,但除非我单击结束搜索的按钮,否则永远不会停止搜索,因此我需要一种无需单击按钮即可结束搜索的方法.

private int radius = 1; // 1 radius (mile or km not sure)
private int max_radius = 15;
private Boolean tradesmanFound = false;
private String tradesmanFoundID;
GeoQuery geoQuery;

private void getClosestTradesman() {
    DatabaseReference tradesmanLocation = FirebaseDatabase.getInstance().getReference().child("TradesmanAvailable");

    GeoFire geoFire = new GeoFire(tradesmanLocation);
    geoQuery = geoFire.queryAtLocation(new GeoLocation(customerLocation.latitude, customerLocation.longitude), radius);
    geoQuery.removeAllListeners();

    geoQuery.addGeoQueryEventListener(new GeoQueryEventListener() {
        @Override
        public void onKeyEntered(String key, GeoLocation location) {
            if (!tradesmanFound && requestBol) {
                DatabaseReference customerDatabase = FirebaseDatabase.getInstance().getReference().child("Users").child("Tradesman").child(key);
                customerDatabase.addListenerForSingleValueEvent(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
                        if (dataSnapshot.exists() && dataSnapshot.getChildrenCount() > 0) {
                            Map<String, Object> tradesmanMap = (Map<String, Object>) dataSnapshot.getValue();
                            if (tradesmanFound) {
                                return;
                            }

                            if (tradesmanMap.get("Trade").equals(tradeType)) {
                                tradesmanFound = true;
                                tradesmanFoundID = dataSnapshot.getKey();

                                DatabaseReference tradesmanRef = FirebaseDatabase.getInstance().getReference().child("Users").child("Tradesman").child(tradesmanFoundID).child("CustomerRequest");
                                String customerID = FirebaseAuth.getInstance().getCurrentUser().getUid();
                                HashMap map = new HashMap();
                                map.put("CustomerRequestID", customerID);
                                tradesmanRef.updateChildren(map);

                                getTradesmanLocation();
                                getTradesmanInfo();
                                isRequestFinished();
                                requestTradesmanBtn.setText("Looking for Tradesman's Location...");
                            }
                        }
                    }

                    @Override
                    public void onCancelled(DatabaseError databaseError) {
                    }
                });
            }
        }

        @Override
        public void onKeyExited(String key) {

        }

        @Override
        public void onKeyMoved(String key, GeoLocation location) {

        }

        @Override
        public void onGeoQueryReady() {
            if (!tradesmanFound) {

                radius++;
                getClosestTradesman();

            }
        }

        @Override
        public void onGeoQueryError(DatabaseError error) {

        }
    });
}

这已经困扰了我一段时间,因为它在我的脑海中似乎非常简单明了,所以任何帮助都会减轻很多压力。谢谢

你真的很接近。当地理查询完成加载其初始数据时,它调用 onGeoQueryReady,您现在拥有的是:

@Override
public void onGeoQueryReady() {
    if (!tradesmanFound) {

        radius++;
        getClosestTradesman();

    }
}

因此,如果没有找到商人,您将开始一个更大半径的新查询。这里缺少两件事:

  1. 如果您还没有达到最大范围,您应该只开始一个新的查询。
  2. 您应该取消刚刚完成的现有地理查询,否则您最终会得到许多重叠的地理查询。

所以在代码中:

@Override
public void onGeoQueryReady() {
    if (!tradesmanFound && radius < 10) {

        geoQuery.removeAllListeners();

        radius++;
        getClosestTradesman();

    }
}

我知道您已经调用了 geoQuery.removeAllListeners(),但您目前调用它的地方实际上没有任何作用。


我在你的代码中注意到了这一点:

private int radius = 1; // 1 radius (mile or km not sure)

半径以公里为单位,如 example query in the docs.

中所示