FusedLocationProviderClient when and how to stop Looper? FusedLocationProviderClient when and how to stop Looper? multithreading multithreading

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