Правильно, поэтому приложение в основном подключает драйвер к пользователю. Когда пользователь делает запрос, он ищет ближайший драйвер, однако моя проблема в том, что если нет доступных драйверов. В настоящее время он просто продолжит поиск, если пользователь не отменит запрос самостоятельно.
То, что я пытался реализовать в методе onGeoQueryReady, было, если радиус <= 5 findClosestTradesman еще endRequest (), но, похоже, он не работал. </p>
Я надеялся, что кто-нибудь увидит, как я могу завершить запрос после определенного времени поиска или, если достигнут максимальный радиус, завершить запрос.
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();
}
//else{
// endRequest();
//Toast.makeText(getApplicationContext(), "No Tradesman Found.", Toast.LENGTH_LONG).show();
}
@Override
public void onGeoQueryError(DatabaseError error) {
}
});
}
Как вы можете видеть, он в настоящее время увеличивает радиус, поэтому я подумал, может быть, если он достигнет максимального радиуса, например, 10 миль, он прекратит поиск и завершит запрос (endRequest () отменит запрос).