Nano Hash - криптовалюты, майнинг, программирование

Как печатать значения акселерометра каждые X секунд в Android

я хочу печатать значения акселерометра каждые 3 секунды. это мой код до сих пор

@Override
    public void onSensorChanged(SensorEvent event) {
        // TODO Auto-generated method stub

        if(event.sensor.getType()==Sensor.TYPE_ACCELEROMETER)
        {              
            x = a * x + (1 - a) * event.values[0];
            y = a * y + (1 - a) * event.values[1];
            z = a * z + (1 - a) * event.values[2];
              new Handler().postDelayed(new Runnable() {
                  @Override
                  public void run() {                     
                      printValue();
                  }
              }, 3000);                        
        }

    }

он задерживает вывод только при запуске приложения, в чем моя ошибка и как ее решить?


  • Вы хотите распечатать их независимо от того, изменятся ли они? 08.10.2014
  • да, и каждые 3 секунды 08.10.2014
  • Вам нужно переместить свой обработчик из вашего onSensorChanged 08.10.2014
  • напишите бесконечный цикл for и установите там задержку в 3 секунды, поэтому каждый раз при выполнении цикла for он будет задерживать 3 секунды 08.10.2014

Ответы:


1

Вам нужно удалить свой обработчик из onSensorChanged(), чтобы он работал постоянно. Прямо сейчас он будет выполняться только в том случае, если у вас есть изменения в показаниях вашего датчика. Кроме того, вам нужно добавить вызов для повторного запуска Runnable, иначе он будет выполняться только один раз.

//Outside of onSensorChanged(), perhaps in onCreate() of your Activity
new Handler().postDelayed(new Runnable() {
    @Override
    public void run() {
        printValue();
        new Handler().postDelayed(this, 3000);
    }
}, 3000);
08.10.2014
  • спасибо, это работает для моего случая, для этого случая я использую ваше решение, спасибо: D 08.10.2014

  • 2

    Я не очень хорошо знаком с postDelayed, но рискну предположить, что каждый из вызовов run задерживается на 3 секунды, однако каждая задержка считается параллельно, тогда как вы хотите, чтобы они задерживались последовательно, так сказать .

    В зависимости от того, как часто вызывается onSensorChanged, вам может быть лучше сделать что-то вроде проверки времени, прошедшего с момента последнего вызова, и если> 3 секунды, то запустить printValue

    @Override
    public void onSensorChanged(SensorEvent event) {
        // TODO Auto-generated method stub
        if(/*time elapsed > 3 seconds*/)
            if(event.sensor.getType()==Sensor.TYPE_ACCELEROMETER)
            {              
                x = a * x + (1 - a) * event.values[0];
                y = a * y + (1 - a) * event.values[1];
                z = a * z + (1 - a) * event.values[2];
                  new Handler().postDelayed(new Runnable() {
                      @Override
                      public void run() {                     
                          printValue();
                      }
                 }, 3000);                        
            }
        }
    }
    
    08.10.2014
  • Нет, через 3 секунды будут напечатаны все значения, а временная проверка вне проверки типа датчика неверна, так как значения не будут обновляться. в течение этого времени 03.08.2018

  • 3

    Я бы лично использовал для этого поток, вы можете запустить этот запуск в onCreate, чтобы он всегда работал, и поэтому вы не ждали его запуска, когда происходит onSensorChanged.

    Thread printvalue = new Thread(new Runnable() {
      @Override
      public void run() {
        try {
          printValue();
          Thread.sleep(3000);
        } catch (Exception e) {
          e.printstacktrace();
        }
      }
    });
    
    08.10.2014
  • Это выполняет только printValue() один раз. 08.10.2014

  • 4

    Ваш текущий код ожидает изменения датчика, затем ждет 3 секунды и печатает.

    Если вы хотите печатать каждые 3 секунды, вам нужно повторно опубликовать свой runnable, когда это будет сделано. postDelayed просто задерживается перед выполнением, вам нужно запустить еще один «таймер» на 3 секунды, когда вы выполнили печать.

    проверьте здесь: Android - периодическое выполнение метода с использованием вызова postDelayed()

    есть вызов postDelayed(runnable) внутри метода запуска самого runnable.

    08.10.2014

    5

    Это напечатает значение, если оно было обновлено через 3 секунды. Таким образом, это может произойти через 3 секунды и несколько миллисекунд, но вам не нужно управлять другим потоком.

    private final static long ACC_CHECK_INTERVAL = 3000;
    private long lastAccCheck;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ...
        lastAccCheck = System.currentTimeMillis();
    }
    
    @Override
    public void onSensorChanged(SensorEvent event) {
        long currTime = System.currentTimeMillis();
        if( event.sensor.getType() == Sensor.TYPE_ACCELEROMETER){              
            x = a * x + (1 - a) * event.values[0];
            y = a * y + (1 - a) * event.values[1];
            z = a * z + (1 - a) * event.values[2];
    
            if(currTime - lastAccCheck > ACC_CHECK_INTERVAL) {
                printValue();
            }
        }
    
    }
    
    03.08.2018
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..