2017-01-16 74 views
0

我有一张地图,我想在其上显示用户的当前位置,并在获取用户位置以获取附近商家后调用api。删除位置管理器不工作的更新

我得到用户的当前位置,并且所有商家都通过地图上的标记获取图形。

但我在LocationListener的onLocationChanged()方法中调用了setMap方法。这个方法被连续调用。

我想获取位置一次并在标记上显示,当下一次用户来到这个片段时,再次只有我想获得更新的位置。

但是现在它会持续进行一次循环,onLocation方法被调用,所以accessMerchants被调用。

为了解决这个问题,我试图从位置管理器中删除更新,如果它第一次进入onLocationChanged()方法,我试图设置一个布尔变量,它将是假的,但它也是在循环中。

删除更新也无法正常工作,如果删除更新工作,然后onLocationChanged方法不应再次调用正确?

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()); 
     } 
    } 
} 

怎么回事?请帮助..我应该在哪里调用removeUpdates?谢谢..

回答

1

您注册了2个提供者的更新,你是否注销了两者?

此外,要使布尔标志起作用,您需要进行更改 - 在函数结束时将其设置为true,并将if更改为if(!receivedLocation)这将使其仅运行一次。事实上,它永远不会运行。

+0

如何从两个提供商注销? – Sid

+0

调用removeUpdates两次,每次提供一次。我也会真正看看你的代码,并试着理解它是如何工作的 - 如果我是你的话 - 你有一堆混合技术,你显然已经复制粘贴,并不能很好地协同工作。 –

+0

谢谢你,它的工作方式.. – Sid