2016-02-15 2 views
1

OnLocationChanged продолжает стрелять несколько раз и вызывает переполнение стека.onLocationChanged Fires Несколько раз и причины Stackoverflows

Вот импорт:

import com.google.android.gms.common.ConnectionResult; 
import com.google.android.gms.common.GooglePlayServicesUtil; 
import com.google.android.gms.maps.*; //addon-google apis 19 google-play-services.jar to libs folder and import it via build path -> configure build path ->Add External Jars 

Здесь вы LocationListener:

private LocationListener mLocationListener = new LocationListener() { 

     @Override 
     public void onLocationChanged(Location location) { 

      Log.e(TAG, "onLocationChanged>>>>>>>>>>>>>>>>>>"); 

      LatLong latLng = new LatLong(location.getLatitude(), location.getLongitude()); 

      centerPoint = latLng; //assign to global current location 
      Log.e(TAG, "onLocationChanged>>>>>>>>>>>>>>>>>>centerPoint" + centerPoint); 

      currentSpeed = location.getSpeed(); 
      Log.e(TAG, "onLocationChanged speed>>>>>>>>>>>>>>>>>>"+ currentSpeed); 

      Log.e(TAG, "onLocationChanged: PROVIDER:>>>>>>>>>>>>>>>>"+location.getProvider().toString()); 

      // GPS location 
      if (location.getProvider().equals(LocationManager.GPS_PROVIDER)) { 
       Log.e(TAG, "onLocationChanged: GPS_PROVIDER>>>>>>>>>>>>>>>>"); 
      } 

     @Override 
     public void onStatusChanged(String provider, int status, Bundle extras) { 

      String statusString = "Unknown"; 

      switch (status) { 

       case LocationProvider.OUT_OF_SERVICE: 
        statusString = "Out of service"; 
        Log.e(TAG, "Out of service>>>>>>>>>>>>>>>>"); 
        break; 

       case LocationProvider.TEMPORARILY_UNAVAILABLE: 
        statusString = "Temporary unavailable"; 
        Log.e(TAG, "Temporary unavailable>>>>>>>>>>>>>>>>"); 
        break; 

       case LocationProvider.AVAILABLE: 
        statusString = "Available"; 
        Log.e(TAG, "AVAILABLE>>>>>>>>>>>>>>>>"); 
        break; 
      } 

      Toast.makeText(
        MainActivity.this, 
        String.format("Provider '%s' status: %s", provider, statusString), 
        Toast.LENGTH_SHORT) 
      .show(); 
     } 

     @Override 
     public void onProviderEnabled(String provider) { 

      Toast.makeText(
        MainActivity.this, String.format("Provider '%s' enabled", provider), Toast.LENGTH_SHORT).show(); 

      // Remove strike-thru in label 
      if (provider.equals(LocationManager.GPS_PROVIDER)) { 
       Log.e(TAG, "GPS_PROVIDER>>>>>>>>>>>>>>>>"); 
      } 

      if (provider.equals(LocationManager.NETWORK_PROVIDER)) { 
       Log.e(TAG, "NETWORK_PROVIDER>>>>>>>>>>>>>>>>"); 
      } 
     } 

     @Override 
     public void onProviderDisabled(String provider) { 

      Toast.makeText(
        MainActivity.this, String.format("Provider '%s' disabled", provider), Toast.LENGTH_SHORT).show(); 

      // Set strike-thru in label and hide accuracy circle 
      if (provider.equals(LocationManager.GPS_PROVIDER)) { 
       Log.e(TAG, "onProviderDisabled: GPS_PROVIDER>>>>>>>>>>>>>>>>"); 

      } 

      if (provider.equals(LocationManager.NETWORK_PROVIDER)) { 
       Log.e(TAG, "onProviderDisabled: NETWORK_PROVIDER>>>>>>>>>>>>>>>>"); 

      } 
     } 
    }; 

    /** 
    * Location Source for google maps 'my location' layer. 
    */ 
    private LocationSource mLocationSource = new LocationSource() { 

     @Override 
     public void activate(OnLocationChangedListener onLocationChangedListener) { 

      mOnLocationChangedListener = onLocationChangedListener; 
     } 

     @Override 
     public void deactivate() { 

      mOnLocationChangedListener = null; 
     } 
    }; 

Вот журнал ошибок LogCat:

02-15 12:30:37.240: I/dalvikvm(9993): threadid=1: stack overflow on call to Ljava/lang/System;.arraycopy:VLILII 
02-15 12:30:37.240: I/dalvikvm(9993): method requires 20+20+0=40 bytes, fp is 0xb028a324 (36 left) 
02-15 12:30:37.240: I/dalvikvm(9993): expanding stack end (0xb028a300 to 0xb028a000) 
02-15 12:30:37.240: I/dalvikvm(9993): Shrank stack (to 0xb028a300, curFrame is 0xb028fec4) 
02-15 12:30:37.280: D/AndroidRuntime(9993): Shutting down VM 
02-15 12:30:37.280: W/dalvikvm(9993): threadid=1: thread exiting with uncaught exception (group=0xb1a76b90) 
02-15 12:30:37.520: E/AndroidRuntime(9993): FATAL EXCEPTION: main 
02-15 12:30:37.520: E/AndroidRuntime(9993): Process: com.example.offlinemapsforgesample, PID: 9993 
02-15 12:30:37.520: E/AndroidRuntime(9993): java.lang.StackOverflowError 
02-15 12:30:37.520: E/AndroidRuntime(9993):  at java.lang.AbstractStringBuilder.enlargeBuffer(AbstractStringBuilder.java:95) 
02-15 12:30:37.520: E/AndroidRuntime(9993):  at java.lang.AbstractStringBuilder.append0(AbstractStringBuilder.java:132) 
02-15 12:30:37.520: E/AndroidRuntime(9993):  at java.lang.RealToString.freeFormat(RealToString.java:232) 
02-15 12:30:37.520: E/AndroidRuntime(9993):  at java.lang.RealToString.convertDouble(RealToString.java:120) 
02-15 12:30:37.520: E/AndroidRuntime(9993):  at java.lang.RealToString.appendDouble(RealToString.java:63) 
02-15 12:30:37.520: E/AndroidRuntime(9993):  at java.lang.StringBuilder.append(StringBuilder.java:184) 
02-15 12:30:37.520: E/AndroidRuntime(9993):  at org.mapsforge.core.model.LatLong.toString(LatLong.java:99) 
02-15 12:30:37.520: E/AndroidRuntime(9993):  at java.lang.StringBuilder.append(StringBuilder.java:202) 
02-15 12:30:37.520: E/AndroidRuntime(9993):  at com.example.offlinemapsforgesample.MainActivity$2.onLocationChanged(MainActivity.java:1874) 
02-15 12:30:37.520: E/AndroidRuntime(9993):  at com.example.offlinemapsforgesample.MainActivity$2.onLocationChanged(MainActivity.java:1917) 
02-15 12:30:37.520: E/AndroidRuntime(9993):  at com.example.offlinemapsforgesample.MainActivity$2.onLocationChanged(MainActivity.java:1917) 
02-15 12:30:37.520: E/AndroidRuntime(9993):  at com.example.offlinemapsforgesample.MainActivity$2.onLocationChanged(MainActivity.java:1917) 
02-15 12:30:37.520: E/AndroidRuntime(9993):  at com.example.offlinemapsforgesample.MainActivity$2.onLocationChanged(MainActivity.java:1917) 
02-15 12:30:37.520: E/AndroidRuntime(9993):  at com.example.offlinemapsforgesample.MainActivity$2.onLocationChanged(MainActivity.java:1917) 
02-15 12:30:37.520: E/AndroidRuntime(9993):  at com.example.offlinemapsforgesample.MainActivity$2.onLocationChanged(MainActivity.java:1917) 

ответ

1

Согласно doconLocationChanged вызывается, когда новая позиция доступна, поэтому, когда датчики (GPS, сеть ...) получить новую, которая может произойти очень часто. Чтобы предотвратить такое поведение, вы можете сохранить новое место в переменной и сделать свою бизнес-логику в своем последнем сохраненном месте с помощью Timer. В противном случае вы делаете это с помощью GoogleApiClient:

LocationRequest locationRequest = new LocationRequest(); 
locationRequest.setInterval(1000); 

LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder() 
       .addLocationRequest(locationRequest); 

LocationServices.SettingsApi.checkLocationSettings(mGoogleApiClient, builder.build()); 

По вашему StackTrace, переполнение стека не из onLocationChanged, но вместо того, чтобы от бизнес-логики написан внутри него.

+0

Я выяснил, что проблема связана с моей бизнес-логикой. @ E-Kami мой метод OnLocationRequest продолжает стрелять, даже когда мой GPS не меняется. Почему это? – user914425

+0

Новый 'LocationListener', который вы используете, не только использует GPS для извлечения вашей позиции пользователя, но также использует множество других датчиков (таких как Wi-Fi, сотовая сеть ...). Для получения дополнительной информации об этом обратитесь к видео [this] (https://www.youtube.com/watch?v=KSB4SQzyaaQ). Надеюсь, поможет –