Firebase / GeoQuery-最大半径IF语句

问题描述 投票:0回答:1

因此,我现在已经尝试了一段时间,以实现一种方法,如果找不到商人或在最大半径内没有商人,我可以更新用户。因此,该应用程序基本上会搜索Firebase中可用的商人,并根据其经纬度与最接近的商人进行匹配。如果在1英里范围内未找到任何东西,则它将增加到2,依此类推。

我一直在努力实施的一种方法是说,在火力基地内没有商人可用,或者在一定范围内没有商人可用,因此一旦增加表示10英里停下来并返回,则找不到商人。

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

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) {

        }
    });
}

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

java android firebase firebase-realtime-database geofire
1个回答
0
投票

您真的很亲密。地理查询加载完初始数据后,它将调用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中可以看到半径为公里。

© www.soinside.com 2019 - 2024. All rights reserved.