Sid
Sid

Reputation: 2862

Remove updates on location manager not working

I have a map on which I want to show user's current location and I am calling an api after getting user's location to get the nearby merchants.

I am getting the user's current location, also all the merchants are getting plot by markers on map.

But I have called the setMap method in the onLocationChanged() method of LocationListener. This method get's called continuously.

I want to get the location once and show on the marker, again when next time user comes to this fragment then only I want to get updated location.

But now it's going in a loop continuously that onLocation method get's called and so accessMerchants is getting called.

To stop this I tried to remove updates from location manager, also I tried to set a boolean variable if it first time goes in onLocationChanged() method, it will be false but again it is also going in a loop.

Remove updates also not working, if remove updates is worked, then onLocationChanged method should not get called again right?

public class SearchMerchantFragment extends Fragment implements GetSearchedMerchantsAsyncTask.GetSearchedMerchantsCallBack, OnMapReadyCallback, GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener {

    LocationListener[] mLocationListeners = new LocationListener[]{
            new LocationListener(LocationManager.GPS_PROVIDER),
            new LocationListener(LocationManager.NETWORK_PROVIDER)
    };


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.fragment_search_merchant, container, false);

        setUpUI(view);

        return view;
    }


    public void setUpUI(View view) {

        initializeLocationManager();

        requestLocation();

        setUpMapIfNeeded();


        mLocationsList = new ArrayList<>();
        markers = new ArrayList<>();

        edtSearch = (EditText) view.findViewById(R.id.edtSearch);

        rv_fetch_merchants = (RecyclerView) view.findViewById(R.id.rv_fetch_merchants);
        merchantsList = new ArrayList<Merchants>();
        merchantsAdapter = new SearchedMerchantsAdapter(this.getContext(), merchantsList);
        rv_fetch_merchants.setLayoutManager(new LinearLayoutManager(getActivity()));
        rv_fetch_merchants.setAdapter(merchantsAdapter);
        rv_fetch_merchants.setHasFixedSize(true);
        rv_fetch_merchants.setItemViewCacheSize(30);
        rv_fetch_merchants.setDrawingCacheEnabled(true);
        rv_fetch_merchants.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);


    }

    //get searched merchants
    public void accessMerchants() {
          if (CommonUtils.isConnectedToInternet(getContext())) {
        new GetSearchedMerchantsAsyncTask(getActivity(), SearchMerchantFragment.this).execute(access_token, sessionUserId, String.valueOf(mLastLocation.getLatitude()), String.valueOf(mLastLocation.getLongitude()));
           } else {
           showAlert(String.valueOf(R.string.check_network));
          }
    }

    @Override
    public void doPostExecute(ArrayList<Merchants> merchantsArrayList) {

        merchantsList.clear();
        merchantsList.addAll(merchantsArrayList);
        merchantsAdapter.notifyDataSetChanged();

        for (Merchants merchants : merchantsList) {
            LatLng latLng = new LatLng(merchants.getLatitude(), merchants.getLongitude());
            MarkerOptions marker = new MarkerOptions().position(latLng).icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED)).title(merchants.getKirana_name());
            Marker m = mGoogleMap.addMarker(marker);
            markers.add(m);
        }

    }

    private void setUpMapIfNeeded() {
        if (mGoogleMap == null) {
            mapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map_fragment);
            mapFragment.getMapAsync(this);
            // getLocation();
        }
    }

    //setup map

    @Override
    public void onMapReady(GoogleMap googleMap) {
        mGoogleMap = googleMap;

        buildGoogleApiClient();

        mGoogleApiClient.connect();

    }

    protected synchronized void buildGoogleApiClient() {
        //   Toast.makeText(getActivity(),"buildGoogleApiClient",Toast.LENGTH_SHORT).show();
        mGoogleApiClient = new GoogleApiClient.Builder(getActivity())
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .addApi(LocationServices.API)
                .build();
    }

    @Override
    public void onConnected(Bundle bundle) {
        // Toast.makeText(getActivity(),"onConnected",Toast.LENGTH_SHORT).show();

    }

    @Override
    public void onConnectionSuspended(int i) {
        //  Toast.makeText(getActivity(),"onConnectionSuspended",Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onConnectionFailed(ConnectionResult connectionResult) {
        //    Toast.makeText(getActivity(),"onConnectionFailed",Toast.LENGTH_SHORT).show();
    }

    private void removeMarkers() {
        if (mGoogleMap != null) {
            for (Marker marker : markers) {
                marker.remove();
            }
            mGoogleMap.clear();
            markers.clear();
        }
    }


    @Override
    public void onDetach() {
        super.onDetach();
        mapConnected = false;
    }

        return true;
    }

    public void setMap() {
        try {

            int locationPermission = ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION);
            int coarseLocation = ContextCompat.checkSelfPermission(getActivity(),Manifest.permission.ACCESS_COARSE_LOCATION);

            if(locationPermission == PackageManager.PERMISSION_GRANTED && coarseLocation == PackageManager.PERMISSION_GRANTED && GPSTracker.isGPSEnabled) {

                if(receivedLocation) {

                    receivedLocation = false;

                    mLatLang = new LatLng(mLastLocation.getLatitude(), mLastLocation.getLongitude());
                    accessMerchants();


                    MarkerOptions markerOptions = new MarkerOptions();
                    markerOptions.position(mLatLang);
                    markerOptions.title(getString(R.string.position));
                    markerOptions.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE));
                    mMarker = mGoogleMap.addMarker(markerOptions);

                    CameraPosition cameraPosition = new CameraPosition.Builder().target(mLatLang).zoom(14).build();

                    mGoogleMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));

                    //  mLocationRequest = new LocationRequest();
                    // mLocationRequest.setInterval(5000); //5 seconds
                    // mLocationRequest.setFastestInterval(3000); //3 seconds
                    //  mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);

                    mGoogleMap.setMyLocationEnabled(true);
                    mGoogleMap.getUiSettings().setZoomControlsEnabled(true);
                    mGoogleMap.getUiSettings().setAllGesturesEnabled(true);

                    LocationListener locationListener = new LocationListener();
                    mLocationManager.removeUpdates(locationListener);

                }
            }
            else {
                showAlert(getString(R.string.locationAlert));
            }

        } catch (SecurityException e) {

        }
    }

    private void initializeLocationManager() {
       // Log.e(Application.TAG, "initializeLocationManager");
        if (mLocationManager == null) {
            mLocationManager = (LocationManager) getActivity().getSystemService(Context.LOCATION_SERVICE);
        }

        boolean gps_enabled = false;
        boolean network_enabled = false;

        try {
            gps_enabled = mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
        } catch (Exception ex) {
        }

        try {
            network_enabled = mLocationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
        } catch (Exception ex) {
        }

        if (!gps_enabled && !network_enabled) {
            // notify user
            showAlert(getString(R.string.locationAlert));
        }

    }

    public class LocationListener implements android.location.LocationListener {

        public LocationListener() {
        }

        public LocationListener(String provider) {
            Log.e(Application.TAG, "LocationListener " + provider);
            mLastLocation = new Location(provider);
        }

        @Override
        public void onLocationChanged(Location location) {
            Log.e(Application.TAG, "onLocationChanged: " + location);

            receivedLocation = true;

            mLastLocation.set(location);

            if (receivedLocation) {
                setMap();
            }
        }

        @Override
        public void onProviderDisabled(String provider) {
            Log.e(Application.TAG, "onProviderDisabled: " + provider);

        }
        @Override
        public void onProviderEnabled(String provider) {
            Log.e(Application.TAG, "onProviderEnabled: " + provider);

        }
        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {
            Log.e(Application.TAG, "onStatusChanged: " + provider);
        }
    }

    public void requestLocation() {

        try {
            mLocationManager.requestLocationUpdates(
                    LocationManager.NETWORK_PROVIDER, 0, 0,
                    mLocationListeners[1]);
        } catch (java.lang.SecurityException ex) {
            Log.i(Application.TAG, "fail to request location update, ignore", ex);
        } catch (IllegalArgumentException ex) {
            Log.d(Application.TAG, "network provider does not exist, " + ex.getMessage());
        }

        try {
            mLocationManager.requestLocationUpdates(
                    LocationManager.GPS_PROVIDER, 0, 0,
                    mLocationListeners[0]);
        } catch (java.lang.SecurityException ex) {
            Log.i(Application.TAG, "fail to request location update, ignore", ex);
        } catch (IllegalArgumentException ex) {
            Log.d(Application.TAG, "gps provider does not exist " + ex.getMessage());
        }
    }
}

What's going wrong?? Please help.. Where should I call removeUpdates?? thank you..

Upvotes: 0

Views: 1728

Answers (1)

Gabe Sechan
Gabe Sechan

Reputation: 93589

You register for updates from 2 providers, did you deregister from both?

Also, to make the boolean flag work you need to make a change- set it to true at the end of the function, and change the if to if(!receivedLocation) That will make it run only once. As it is, it will never run.

Upvotes: 1

Related Questions