2017-09-15 4 views
2

Je suis en train d'exécuter un job d'arrière-plan pour réenregistrer les Geofences lorsqu'elles ont expiré.setResultCallback lors de l'enregistrement Les Geofences ne sont pas déclenchées dans AsyncTask

Le code est déclenché correctement. La notification est déclenchée dans onPostExecute, mais le code à l'intérieur du setResultCallback n'est jamais accessible.

Comment dois-je activer ce rappel pour que l'objet PlaceBuffer puisse être envoyé à la classe de géolocalisation et, par conséquent, ajouté et enregistré?

@Override 
    public boolean onStartJob(final JobParameters job) 
    { 
     mBackgroundTask = new AsyncTask<Object, Void, List<String>>() 
     { 
      @Override 
      protected List<String> doInBackground(Object... params) 
      { 
       Context context = GeofenceRegistrationFirebaseJobService.this; 

       // get all places in the database 
       Uri uri = PlaceContract.PlaceEntry.CONTENT_URI; 
       Cursor cursor = context.getContentResolver().query(
         uri, 
         null, 
         null, 
         null, 
         null); 

       if (cursor == null || cursor.getCount() == 0) return null; 

       List<String> placesIds = new ArrayList<>(); 

       cursor.moveToPosition(-1); 
       while (cursor.moveToNext()) 
       { 
        placesIds.add(cursor.getString(cursor 
          .getColumnIndex(PlaceContract.PlaceEntry.COLUMN_PLACE_ID))); 
       } 
       cursor.close(); 
       return placesIds; 
      } 

      @Override 
      protected void onPostExecute(List<String> placesIds) 
      { 
       Context context = GeofenceRegistrationFirebaseJobService.this; 

       // Build up the LocationServices API client 
       googleApiClient= new GoogleApiClient.Builder(context) 
         .addApi(LocationServices.API) 
         .addApi(Places.GEO_DATA_API) 
         .build(); 

       geofencing = new Geofencing(context, googleApiClient); 

       PendingResult<PlaceBuffer> placeResult = 
         Places.GeoDataApi.getPlaceById(googleApiClient, 
           placesIds.toArray(new String[placesIds.size()])); 

       placeResult.setResultCallback(new ResultCallback<PlaceBuffer>() 
       { 
        @Override 
        public void onResult(@NonNull PlaceBuffer places) 
        {  
         geofencing.addUpdateGeofences(places); 
         geofencing.registerAllGeofences(); 
        } 
       }); 



       // when the job is finished, issue a notification if is set in preferences 
       SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(context); 
       // does user have notifications enabled? 
       boolean wantNotif = 
         pref.getBoolean(context 
           .getString(R.string.pref_activate_notification_key), true); 
       if(wantNotif) 
       { 
        BackgroundTasks.executeTask(context, 
          BackgroundTasks.ACTION_NOTIFY_USER_GEOFENCES_REGISTERED); 
       } 



       jobFinished(job, false); 
      } 
     }; 
     mBackgroundTask.execute(); 
     return true; 
    } 

Répondre

0

Solution trouvée. C'est incroyable à quel point une solution simple peut sembler impossible à trouver parfois. Lors de la construction du client API, ajoutez les rappels et CONNECT le client.

// Build up the LocationServices API client 
       googleApiClient= new GoogleApiClient.Builder(context) 
         .addConnectionCallbacks(new GoogleApiClient.ConnectionCallbacks() 
         { 
          @Override 
          public void onConnected(@Nullable Bundle bundle) 
          { // add your stuff, we are connected 
          } 

          @Override 
          public void onConnectionSuspended(int i) { 
           googleApiClient.connect(); 
          } 
         }) 
         .addApi(LocationServices.API) 
         .addApi(Places.GEO_DATA_API) 
         .build(); 

       // CONNECT the client 
       if (!googleApiClient.isConnecting() || !googleApiClient.isConnected()) 
       { 
        googleApiClient.connect(); 
       }