2017-02-23 4 views
1

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(); 
} 
} 
+0

Try Um nachzurüsten aysnc ruft onConnected() -Methode auf und wenn Sie die Antwort Ihrer Anrufe erhalten haben, rufen Sie startGeofences() auf. – Umar

+0

könnten Sie das ausarbeiten? Ist das nicht das, was ich zu vermeiden versuche, wie in meinem ursprünglichen Beitrag beschrieben? – Tim

Antwort

1

Versuchen Sie diesen Ansatz

public class GeofenceHelper implements GoogleApiClient.ConnectionCallbacks, 
    GoogleApiClient.OnConnectionFailedListener, LocationListener, ResultCallback<Status> { 
private List<Geofence> mGeofenceList = new ArrayList<>(); 
private GoogleApiClient googleApiClient; 


private List<Point> pointsList = null; 

public GeofenceHelper(Activity context) { 
    this.context = context; 
    permissionsHelper = new PermissionsHelper(context, REQ_PERMISSION); 

    // let both work in parallel 
    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 registerGeofences() { 

    if (pointsList != null) { 
     // populate data in list 
     for (int i = 0; i < pointsList.size(); i++) { 
      mGeofenceList.add(new Geofence.Builder() 
        .setRequestId(pointsList.get(i).getName()) 
        .setCircularRegion(
          pointsList.get(i).getLatitude(), 
          pointsList.get(i).getLongitude(), 
          pointsList.get(i).getRadius()) 
        .setTransitionTypes(Geofence.GEOFENCE_TRANSITION_ENTER 
          | Geofence.GEOFENCE_TRANSITION_EXIT) 
        .setExpirationDuration(Geofence.NEVER_EXPIRE) 
        .build()); 
     } 

     // this will actually register geofences 
     startGeofences(); 

    } 
} 

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

      pointsList = points; 

      registerGeofences(); 
     } 
    }); 
} 


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"); 
    getLastKnownLocation(); 
    registerGeofences(); 
} 

}

+0

Danke, es funktioniert jetzt – Tim

Verwandte Themen