Ich versuche, eine Android-Anwendung mit Geofence-Standorten zu erstellen, die von einer externen API geladen werden. Ich benutze Retrofit, um die Aysnc-Anrufe zu tätigen. Das Problem ist, dass sowohl der googleApiClient
als auch der externe API-Aufruf asynchron sind. Ich weiß also nicht, welcher zuerst fertig ist, um die Geofences zu starten.So vermeiden Sie mehrere Rückrufstufen in Android mit Geofences
Wenn ich die Geofences in der onConnected()
der googleApiClient
starte, habe ich vielleicht noch nicht die LatLng's von der API. Aber wenn ich die Geofences vom Callback der API starte, ist die googleApiClient
möglicherweise noch nicht geladen worden.
Was könnte ich tun, um dieses Problem zu lösen, anstatt nur den asynchronen API-Aufruf in der onConnected()
der googleApiClient
zu tun. Ich versuche, mehrere Rückrufstufen zu vermeiden. Hier ist mein Code, der zur Zeit nicht funktioniert, weil ich die Ergebnisse der API denken, sind noch nicht da, wenn die startGeofences()
genannt wird:
public class GeofenceHelper implements GoogleApiClient.ConnectionCallbacks,
GoogleApiClient.OnConnectionFailedListener, LocationListener, ResultCallback<Status> {
private List<Geofence> mGeofenceList = new ArrayList<>();
private GoogleApiClient googleApiClient;
public GeofenceHelper(Activity context){
this.context = context;
permissionsHelper = new PermissionsHelper(context, REQ_PERMISSION);
buildGoogleApiClient();
geofencePointsRequest();
}
private void startGeofences() {
Log.i(TAG, "startGeofences()");
if (!googleApiClient.isConnected()) {
Log.d(TAG, "Not connected");
return;
}
if (permissionsHelper.checkPermission())
LocationServices.GeofencingApi.addGeofences(
googleApiClient,
getGeofencingRequest(),
getGeofencePendingIntent()
).setResultCallback(this); // Result processed in onResult()
}
private void geofencePointsRequest() {
GeofenceAreasRequest response = new GeofenceAreasRequest();
response.getAllAreas(new GeofenceAreasResponse() {
@Override
public void onAreasLoaded(List<Point> points, int code) {
Log.i(TAG, "Responsecode: " + String.valueOf(code));
for (int i = 0; i < points.size(); i++) {
mGeofenceList.add(new Geofence.Builder()
.setRequestId(points.get(i).getName())
.setCircularRegion(
points.get(i).getLatitude(),
points.get(i).getLongitude(),
points.get(i).getRadius())
.setTransitionTypes(Geofence.GEOFENCE_TRANSITION_ENTER
| Geofence.GEOFENCE_TRANSITION_EXIT)
.setExpirationDuration(Geofence.NEVER_EXPIRE)
.build());
}
}
});
}
private GeofencingRequest getGeofencingRequest() {
Log.d(TAG, "getGeofencingRequest");
GeofencingRequest.Builder builder = new GeofencingRequest.Builder();
builder.setInitialTrigger(GeofencingRequest.INITIAL_TRIGGER_ENTER);
builder.addGeofences(mGeofenceList);
return builder.build();
}
public void start(){
googleApiClient.connect();
}
public void stop(){
googleApiClient.disconnect();
}
@Override
public void onConnected(@Nullable Bundle bundle) {
Log.i(TAG, "google api connected");
startGeofences();
getLastKnownLocation();
}
}
Try Um nachzurüsten aysnc ruft onConnected() -Methode auf und wenn Sie die Antwort Ihrer Anrufe erhalten haben, rufen Sie startGeofences() auf. – Umar
könnten Sie das ausarbeiten? Ist das nicht das, was ich zu vermeiden versuche, wie in meinem ursprünglichen Beitrag beschrieben? – Tim