2016-05-17 10 views
0

У меня есть рабочее приложение, которое мне нужно настроить. Я пытаюсь получить ярлык, чтобы обновлять каждые «n» секунды с помощью метода postDelayed, но я только заставляю его задерживать время, в которое он впервые показывает, и обновлять ярлык так часто. Я попробовал несколько способов использования метода Runnable с postDelayed, но я не смог ничего сделать, кроме как, опять же, задержать начальную запись. Я был бы признателен за любые отзывы или советы относительно того, как заставить его работать. «TextLightReading.setText» - это метка, на которую я пытаюсь отложить обновление.Использование postDelayed для данных датчика

`@Override 
public void onSensorChanged(final SensorEvent event) { 

    if (event.sensor.getType() == Sensor.TYPE_LIGHT) { 
     final Handler mHandler = new Handler(); 
     mHandler.postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       mHandler.postDelayed(this, 1000); 
       final float lux = event.values[0]; 
       final float conversion = Math.round(((1/638f) * lux) * 100.0f)/100.0f; 
       textLightReading.setText("Light: " + conversion); 
      } 
     }, 1000); 
    } 
}` 

Это еще одна попытка ...

`@Override 
public void onSensorChanged(final SensorEvent event) { 

    if (event.sensor.getType() == Sensor.TYPE_LIGHT) { 
     float lux = event.values[0]; 
     final float conversion = Math.round(((1/638f) * lux) * 100.0f)/100.0f; 
     final Handler mHandler = new Handler(); 
     mHandler.postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       textLightReading.setText("Light: " + conversion); 
       //mHandler.postDelayed(this, 1000); 
      } 
     }, 1000); 
    } 
}` 

Я уверен, что я просто не понимаю, как это использовать. Еще раз спасибо.

+0

ваш первый результат попытки в рекурсии, так как вы назвали его на вершине, вторая попытка всякий раз, когда сменяется датчик, он создаст новый обработчик, поэтому, если датчик быстро изменится, это приведет к появлению многих экземпляров обработчика, попробуйте создать объект Single Handler и поместиться внизу. –

+0

Итак, я бы только завернул оператор if в обработчике/Runnable? Я считаю, что я тоже пробовал это, имея только тот же результат в задержке в первом посте этикетки. –

ответ

0

Попробуйте Первый подход

Handler mHandler = new Handler(); 
    float lux,conversion;// intialize it 
    Runnable run=new Runnable() { 

    @Override 
    public void run() { 

      textLightReading.setText("Light: " + conversion); 
      //Line to kill runnable before a new one starts 
      mHandler.removeCallbacks(run); 

    } 
}; 

    //it will update 1 second after onSensorChanged called and when condition true 
    //As per your both attempts 
    @Override 
public void onSensorChanged(final SensorEvent event) { 

if (event.sensor.getType() == Sensor.TYPE_LIGHT) { 

    lux = event.values[0]; 
    conversion = Math.round(((1/638f) * lux) * 100.0f)/100.0f; 
    mHandler.postDelayed(run, 1000); 

    } 
} 

Чтобы получить метку, чтобы обновить каждый «п» секунд не имеет значения, если onSensorChanged называется

второй подход Часть 1: // Использование Таймера

Timer swipeTimer = new Timer(); 
swipeTimer.schedule(new TimerTask() { 

      @Override 
      public void run() { 
       mHandler.post(run); 
      } 
     }, 500, 500); //put this onCreateView or at initialization 

Примечание: если таймер больше не нужен, пользователи должны вызвать отмену, которая освобождает поток таймера и другие r ЕСУРСЫ. Таймеры, явно не аннулированные, могут удерживать ресурсы неограниченно долго.

второй подход Часть 2: Подобный подход упоминается в вашем вопросе

Handler mHandler = new Handler(); 
    Runnable run=new Runnable() { 

    @Override 
    public void run() { 


      textLightReading.setText("Light: " + conversion); //update textView 
       mHandler.postDelayed(run, 1000); 
    } 
}; 


       mHandler.post(run); // at initialization or anywhere in your code where you want to start handler 

    @Override 
public void onSensorChanged(final SensorEvent event) { 

if (event.sensor.getType() == Sensor.TYPE_LIGHT) { 

    lux = event.values[0]; 
    conversion = Math.round(((1/638f) * lux) * 100.0f)/100.0f; 

    } 
} 

Есть много других способов, которые вы можете сделать это ...

+1

Я отредактировал вам ответ, но как только я добавил 'handler.removeCallbacks (run);' к запуску Runnable в конце он сработал! Он убил текущий runnable перед вызовом другого нового 1сек после! Большое вам спасибо за вашу помощь! –