【发布时间】:2020-08-13 12:55:48
【问题描述】:
所以我现在一直在尝试实现一种方法,如果没有找到商人或在最大半径内没有商人,我可以更新用户。因此,该应用程序基本上会搜索 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