1

Я использую следующий код для запроса обновлений местоположения. Обновления местоположения запрашиваются в отдельном потоке обработчика, но все же он влияет на основной поток. Кто-нибудь может предложить решение.Использование обновлений местоположения влияет на основной поток

private LocationListener mLocationListener = new LocationListener() { 

    public void onLocationChanged(Location location) { 

      mLongitude = location.getLongitude(); 
      mLatitude = location.getLatitude(); 
      mBearing = location.getBearing(); 

     } 
} 


mLocationManager = (LocationManager) 
       this.getSystemService(Context.LOCATION_SERVICE); 

HandlerThread handlerThread = new HandlerThread("HandlerThread"); 
handlerThread.start(); 

Looper looper = handlerThread.getLooper(); 

mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 
            UPDATE_LOCATION_INTERVAL, 
            UPDATE_LOCATION_MINIMUM_DISTANCE, 
            mLocationListener, looper); 
mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 
            UPDATE_LOCATION_INTERVAL, 
            UPDATE_LOCATION_MINIMUM_DISTANCE, 
            mLocationListener, looper); 
+0

Откуда вы знаете, что это влияет на основную тему? – Eenvincible

+0

Я использую основной поток для получения видео по сети, он получает влияние. Он отлично работает при отключении обновлений местоположения, но начинает сбой с обновлениями местоположения. – goldenptr

+1

«Я использую основной поток для получения видео по сети» - это плохо само по себе. Не выполняйте сетевой ввод-вывод в основном потоке приложения. Вы должны сбиваться с «NetworkOnMainThreadException». – CommonsWare

ответ

0

Наиболее вероятно, проблема, кажется, что петлитель не готов, когда вы звоните Looper looper = handlerThread.getLooper();. В результате получается looper null, что приводит к появлению обновлений местоположения в основном потоке. Вот еще одна информация о функции getLooper(). Попробуйте это:

public class LocationThread extends HandlerThread { 

    private static final long UPDATE_LOCATION_INTERVAL = 0; //Set this to whatever you had it at 
    private static final float UPDATE_LOCATION_MINIMUM_DISTANCE = 0.0f; //Same with this 

    private LocationManager mLocationManager; 
    private LocationListener mLocationListener; 

    public LocationThread(String name){ 
     super(name); 
    } 

    //Pass in your location manager and listener to this. This assumes they are not null! 
    public void startLocationUpdates(LocationManager locationManager, LocationListener locationListener){ 
     mLocationManager = locationManager; 
     mLocationListener = locationListener; 
     start(); 
    } 

    //Use this to stop the updates and kill the thread. 
    public void stopLocationUpdates(){ 
     if(mLocationManager != null){ 
      mLocationManager.removeUpdates(mLocationListener); 
      mLocationListener = null; 
      mLocationManager = null; 
     } 

     quit(); 
    } 

    @Override 
    protected void onLooperPrepared() { 
     mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 
             UPDATE_LOCATION_INTERVAL, 
             UPDATE_LOCATION_MINIMUM_DISTANCE, 
             mLocationListener, getLooper()); 
     mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 
             UPDATE_LOCATION_INTERVAL, 
             UPDATE_LOCATION_MINIMUM_DISTANCE, 
             mLocationListener, getLooper()); 
    } 
} 

Для этого класса, не используйте start() или quit() функции, так как они уже используются внутри.