2017-09-15 9 views
2

Geofenceが期限切れになったときに再登録するバックグラウンドジョブを実行しています。Geofences登録時のsetResultCallbackがAsyncTask内で起動されない

コードが正常にトリガされます。通知はonPostExecuteで開始されますが、setResultCallbackのコードは決してアクセスされません。

オブジェクトをジオフェンシングクラスに送信できるため、そのコールバックを有効にする必要があるため、追加および登録されますか?

@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; 
    } 

答えて

0

解決策が見つかりました。シンプルなソリューションが時々見つけられないように見えてしまうのは驚くべきことです。 APIクライアントを構築するときは、コールバックを追加してCONNECTクライアントを追加します。

// 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(); 
       } 
関連する問題