Я пытаюсь использовать несколько датчиков, таких как Accelerator, Magnetic Field, Light и т. Д., И для каждого датчика я написал отдельный класс, который не является активным, у каждого из них есть свой SensorEventListener , То, что я хочу сделать, - это когда пользователь выбирает один из них. Я начинаю показывать данные на фрагменте (в MainActivity), когда пользователь меняет предыдущий датчик, который должен остановиться, а новый должен начинаться. Однако, когда я пытаюсь остановить предыдущий, отменив его прослушиватель, он не отменяет регистрацию, но регистрируется и работает. Я хочу остановить предыдущего слушателя. Что не так? Есть идеи?Доступ к нескольким датчикам в классах неактивности
Здесь находится класс датчика;
public class Accelerometer
{
private SensorManager sensorManager;
private Sensor sensor;
public List<ObjAccelerometer> lstData;
ObjAccelerometer currentData;
float lastX,lastY,lastZ;
String currentTime;
int numberOfSamples;
Context context;
public Accelerometer(Context _context,int _numberSample)
{
context=_context;
sensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
numberOfSamples=_numberSample;
lstData=new ArrayList<>();
}
public void registerUnregister(boolean register)
{
if(register)
sensorManager.registerListener(mSensorListener, sensor, SensorManager.SENSOR_DELAY_FASTEST);
else
sensorManager.unregisterListener(mSensorListener);
}
Calendar time;
private final SensorEventListener mSensorListener = new SensorEventListener() {
public void onSensorChanged(SensorEvent event) {
if(numberOfSamples>lstData.size()) {
if (currentData != null) {
lastX = currentData.get_x();
lastY = currentData.get_y();
lastZ = currentData.get_z();
}
currentData = new ObjAccelerometer();
time = Calendar.getInstance();
currentTime = time.get(Calendar.HOUR) + ":" + time.get(Calendar.MINUTE) + ":" + time.get(Calendar.SECOND) + ":" + time.get(Calendar.MILLISECOND);
currentData.set_time(currentTime);
currentData.set_x(event.values[0]);
currentData.set_y(event.values[1]);
currentData.set_z(event.values[2]);
Float speed = Math.abs(event.values[0] + event.values[1] + event.values[2] - lastX - lastY - lastZ);
currentData.set_speed(speed);
lstData.add(currentData);
Util.createToaster(context, "X Y Z Time:" + currentData.toString());
}
else
registerUnregister(false);
}
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
};
}
Здесь код для их вызова;
unRegisterAllSensors();
switch (selectedSensor) {
case Accelerometer:
accelerometer= new Accelerometer(context, DEFAULT_SAMPLE_NUMBER);
accelerometer.registerUnregister(true);
lstAccelerometer = accelerometer.lstData;
break;
case Linear_Accelerometer:
linearAccelerometer= new LinearAccelerometer(context, DEFAULT_SAMPLE_NUMBER);
linearAccelerometer.registerUnregister(true);
break;
....
Вот это unRegisterAllSensors() код функции:
if(accelerometer!=null) {
accelerometer.registerUnregister(false);
accelerometer=null;
}
if(linearAccelerometer!=null) {
linearAccelerometer.registerUnregister(false);
linearAccelerometer=null;
}
На основе кода в вашем вопросе это должно работать. Возможно, разместите еще какой-нибудь код, который будет участвовать во всем процессе. Вы уверены, что вызывается код, ответственный за коммутацию датчиков? – kostek
другого кода нет, я просто выбираю датчик и на основе выбора создаю экземпляр класса и показывая данные как тосты на экране. Переключение датчика также отлично работает. Проблема заключается в отмене регистрации sensoreventlistener – codelife
Возможно, после сообщения 'sensorManager.registerListener' и' sensorManager.unistristerListener' можно добавить сообщение журнала, чтобы узнать, вызываются ли они, когда они должны. – kostek