Mam bardzo prostą aplikację na Androida: w działaniu mam przycisk i uruchamiam/zatrzymuję narzędzie OrientationListener. Jednak po wyrejestrowaniu go, w ddms nadal widzę wątek android.hardware.SensorManager $ SensorThread] (Running).SensorEventListener nie zostanie wyrejestrowany za pomocą metody unregisterListener()
Kod rejestracyjny:
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
List<Sensor> sensors = sensorManager.getSensorList(Sensor.TYPE_ORIENTATION);
if (sensors.size() > 0)
{
sensor = sensors.get(0);
running = sensorManager.registerListener(sensorEventListener, sensor, SensorManager.SENSOR_DELAY_FASTEST);
}
i wyrejestrowania:
try
{
if (sensorManager != null && sensorEventListener != null)
{
sensorManager.unregisterListener(sensorEventListener,sensor);
running = false;
}
}
catch (Exception e)
{
Log.w(TAG, e.getMessage());
}
Sposób unregisterListener()
nie zostanie wykonany, jednak nie zabija wątku czujniki bardzo często, co utrzymuje prowadzenie oraz odprowadzanie bateria. Po kilku godzinach moja aplikacja jest wymieniona z 20-30% wyczerpaniem baterii. Jak to możliwe? Jak mogę się upewnić, że czujnik zostanie wyrejestrowany? Nie otrzymuję żadnych wyjątków ani żadnych błędów w kodzie logowania. Próbowałem uruchomić słuchacza w Serwisie - to samo.
Miałem podobny problem, rozwiązać go tutaj http://stackoverflow.com/questions/16504474/ wątek z Androidem - nie można wyrejestrować - sensoreventlistener [1]: http://stackoverflow.com/questions/16504474/android-thread-cannot-unregister-sensoreventlistener – tricknology