2015-06-02 7 views
1

Я пытаюсь использовать несколько датчиков, таких как 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; 
     } 
+0

На основе кода в вашем вопросе это должно работать. Возможно, разместите еще какой-нибудь код, который будет участвовать во всем процессе. Вы уверены, что вызывается код, ответственный за коммутацию датчиков? – kostek

+0

другого кода нет, я просто выбираю датчик и на основе выбора создаю экземпляр класса и показывая данные как тосты на экране. Переключение датчика также отлично работает. Проблема заключается в отмене регистрации sensoreventlistener – codelife

+0

Возможно, после сообщения 'sensorManager.registerListener' и' sensorManager.unistristerListener' можно добавить сообщение журнала, чтобы узнать, вызываются ли они, когда они должны. – kostek

ответ

0

К сожалению о утруждая людей, это на самом деле работает! Я внес несколько изменений, включая окончательный параметр SensorManager, а также удаление сообщения Toast и добавление тостера только для регистрации и отмены регистрации каждого слушателя. Это сработало! Я считаю, что проблема была вызвана двумя вещами; 1-Тосты сообщения медленнее, чем восприятие, из-за этого, несмотря на то, что незарегистрированные сообщения все еще были на экране некоторое время. 2- Когда я не определил окончательный результат SensorManager, каждый раз, когда я получал новый экземпляр, размер списка слушателей был 0.

Тем не менее, это может быть хорошим образцом для людей, которые хотят звонить датчикам от неактивных классов. Спасибо!

+0

Тосты - это не лучший способ отладки приложения. Используйте для этого журналы. – kostek

Смежные вопросы