因此,我现在已经尝试了一段时间,以实现一种方法,如果找不到商人或在最大半径内没有商人,我可以更新用户。因此,该应用程序基本上会搜索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) {
}
});
}
这已经困扰了我一段时间,因为我的脑海里似乎很简单明了,因此任何帮助都会减轻很多压力。谢谢
您真的很亲密。地理查询加载完初始数据后,它将调用onGeoQueryReady
,您现在将其设置为:
@Override
public void onGeoQueryReady() {
if (!tradesmanFound) {
radius++;
getClosestTradesman();
}
}
因此,如果没有找到商人,您将开始一个更大半径的新查询。这里缺少两件事:
因此在代码中:
@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中可以看到半径为公里。