FusedLocationProviderClient when and how to stop Looper?
You just need to call mFusedLocationClient.removeLocationUpdates(mLocationCallback)
in onPause()
of your Activity. However, there is a bit more to it than just that.
Use member variables for the FusedLocationProviderClient and LocationRequest in your main activity:
import com.google.android.gms.location.FusedLocationProviderClient;import com.google.android.gms.location.LocationCallback;import com.google.android.gms.location.LocationRequest;import com.google.android.gms.location.LocationResult;public class MainActivity extends AppCompatActivity GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener { FusedLocationProviderClient mFusedLocationClient; LocationRequest mLocationRequest; //..........
Use a member variable for the LocationCallback as well:
LocationCallback mLocationCallback = new LocationCallback(){ @Override public void onLocationResult(LocationResult locationResult) { for (Location location : locationResult.getLocations()) { Log.i("MainActivity", "Location: " + location.getLatitude() + " " + location.getLongitude()); } };};
Then, assign mFusedLocationClient
in onCreate()
:
@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this); requestLocationUpdates(); //...............}
Then in onResume()
, if theFusedLocationProviderClient is set up, then use it.
@Overridepublic void onResume() { if (mFusedLocationClient != null) { requestLocationUpdates(); }}public void requestLocationUpdates() { mLocationRequest = new LocationRequest(); mLocationRequest.setInterval(120000); // two minute interval mLocationRequest.setFastestInterval(120000); mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY); if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { mFusedLocationClient.requestLocationUpdates(mLocationRequest, mLocationCallback, Looper.myLooper()); }}
And finally, in onPause()
, call removeLocationUpdates()
:
@Overridepublic void onPause() { super.onPause(); if (mFusedLocationClient != null) { mFusedLocationClient.removeLocationUpdates(mLocationCallback); }}
After getting location just remove mFusedLocationClient.removeLocationUpdates
as he mentioned in above answers.
if (mFusedLocationClient != null) mFusedLocationClient.removeLocationUpdates(mLocationCallback);
Looper will be called requestLocationUpdates
until you remove it.
In my problem, I did as I mention above. Below is my code.
mFusedLocationClient.getLastLocation() .addOnSuccessListener(new OnSuccessListener<Location>() { @Override public void onSuccess(Location location) { // GPS location can be null if GPS is switched off if (location != null) { mLocation = location; if (mFusedLocationClient != null) { mFusedLocationClient.removeLocationUpdates(mLocationCallback); } } else { startLocationUpdates(); } } }) .addOnFailureListener(new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { Toast.makeText(HomeActivity.this, "Error trying to get last GPS location", Toast.LENGTH_SHORT).show(); e.printStackTrace(); } });
and below is my requestLocationUpdates
so I will get a request until the location is available.
private void startLocationUpdates() { mSettingsClient.checkLocationSettings(mLocationSettingsRequest) .addOnSuccessListener(this, new OnSuccessListener<LocationSettingsResponse>() { @Override public void onSuccess(LocationSettingsResponse locationSettingsResponse) { Log.i(TAG, "All location settings are satisfied."); getPackageManager().checkPermission(Manifest.permission.ACCESS_FINE_LOCATION, getPackageName()); mFusedLocationClient.requestLocationUpdates(mLocationRequest, mLocationCallback, Looper.myLooper()); getLastLocationNewMethod(); } }) .addOnFailureListener(this, new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { int statusCode = ((ApiException) e).getStatusCode(); switch (statusCode) { case LocationSettingsStatusCodes.RESOLUTION_REQUIRED: Log.i(TAG, "Location settings are not satisfied. Attempting to upgrade " + "location settings "); try { ResolvableApiException rae = (ResolvableApiException) e; rae.startResolutionForResult(HomeActivity.this, 0x1); } catch (IntentSender.SendIntentException sie) { Log.i(TAG, "PendingIntent unable to execute request."); } break; case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE: String errorMessage = "Location settings are inadequate, and cannot be " + "fixed here. Fix in Settings."; Log.e(TAG, errorMessage); Toast.makeText(HomeActivity.this, errorMessage, Toast.LENGTH_LONG).show(); // mRequestingLocationUpdates = false; } getLastLocationNewMethod(); // this method is where I can get location. It is calling above method. } }); }
Note: For more information here is GitHub Repo LINK