2016-09-06 23 views
0

Итак, я пытаюсь запустить мой sensor reading method через 10 секунд и остановить его, скажем, 5 минут. Это код для того же самого.Автоматический запуск и остановка

case R.id.btn_pos_poll_side: { 

       final Handler handler = new Handler(); 
       //Delay Runner Here 
       handler.postDelayed(new Runnable() { 
        @Override 
        public void run() { 
         side_output.setText("Delayed Data Collection"); 
         //Start reading LIGHT SENSOR Data, Handle Null Light Sensor Data 
         if (LightSensor != null || mProximity != null || mAccelerometer != null || mGyroscope != null) { 

          //listen to light sensor. 
          mySensorManager.registerListener(
            MultiSensorListener, 
            LightSensor, 
            SensorManager.SENSOR_DELAY_NORMAL); 

          //listen to proximity sensor. 
          mySensorManager.registerListener(
            MultiSensorListener, 
            mProximity, 
            SensorManager.SENSOR_DELAY_NORMAL); 

          //listen accelerometer, note this has 3-axes. 
          mySensorManager.registerListener(
            MultiSensorListener, 
            mAccelerometer, 
            SensorManager.SENSOR_DELAY_NORMAL); 
          //listen gyroscope, note this has 3-axes. 
          mySensorManager.registerListener(
            MultiSensorListener, 
            mGyroscope, 
            SensorManager.SENSOR_DELAY_NORMAL); 

          //print output text 
          side_output.setText(Html.fromHtml("<h3> ----- Data Collection Session Starts Here -----</h3>")); 

         } else { 
          side_output.setText("No Sensor Found!"); 
         } 
        } 
       }, 10000); 

       final Handler closeHandler = new Handler(); 
       //Data Sender Runner Here 
       closeHandler.postDelayed(new Runnable() { 
        @Override 
        public void run() { 
         Button stopCollection = (Button) findViewById(R.id.btn_stop_poll_side); 
         stopCollection.performClick(); 
        } 
       }, 120000); 
       break; 
      } 

Однако это никогда не работает и даже данные, собранные несколько коррумпированы (новые данные объединяются в предыдущие данные).

Что я делаю неправильно?

Спасибо.

Редактировать: Еще несколько деталей. Я хочу запустить его через 10 секунд после того, как я нажал кнопку и остановил ее, скажем, 2 минуты. Это происходит только один раз, если я снова не нажму кнопку.

Добавлено: Стоп Logic

case R.id.btn_stop_poll_side: { 
       // remove sensor listener 
       mySensorManager.unregisterListener(MultiSensorListener, 
         LightSensor); 
       mySensorManager.unregisterListener(MultiSensorListener, 
         mProximity); 
       mySensorManager.unregisterListener(MultiSensorListener, 
         mAccelerometer); 
       mySensorManager.unregisterListener(MultiSensorListener, 
         mGyroscope); 
       side_output.append("\n" + sensorReading); 
       /* 
        Reading data and writing to Dropbox! 
       */ 
       new DropboxTask(side_output, "Back Pocket Data Reading", sensorReading).execute(); 
       break; 
      } 
+0

Вы хотите, чтобы начало и прекращение происходило в течение жизни или для ограниченного нет. раз? –

+0

@DarshanMiskin Я хочу запустить его через 10 секунд после того, как я нажал кнопку и остановил ее, скажем, 2 минуты. Это происходит только один раз, если я снова не нажму кнопку. –

+0

Ваши обработчики кажутся логически правильными, за исключением того, что метод остановки будет вызываться всего за 10 секунд до 2 минут. в чем именно проблема, с которой вы столкнулись? –

ответ

1

Когда пользователь нажимает на кнопку в первый раз:

final Handler handler = new Handler(); 
Runnable runnable = new Runnable() { 
    @Override 
    public void run() { 
     // Do what you need to do 
    } 
} 
handler.postDelayed(runnable, 10_000 /* Wait 10 seconds */); 

Когда пользователь нажимает на кнопку второй раз:

final Handler handler = new Handler(); 
Runnable runnable = new Runnable() { 
    @Override 
    public void run() { 
     // Stop what you want to stop 
    } 
} 
handler.postDelayed(runnable, 2*60*1000 /* Wait 2 minutes */); 

Это должно быть сделано в onClick вашей кнопки:

Сначала определите частный булев, называемый isButtonAlreadyClicked = false.

Сейчас:

yourButton.setOnClickListener(new OnClickListener() { 
    @Override 
    public void onClick(View view) { 
     if(!isButtonAlreadyClicked) { 
      final Handler handler = new Handler(); 
      Runnable runnable = new Runnable() { 
       @Override 
       public void run() { 
        // Do what you need to do 
       } 
      } 
      handler.postDelayed(runnable, 10_000 /* Wait 10 seconds */); 
      isButtonAlreadyClicked = true; 
     } else { 
      final Handler handler = new Handler(); 
      Runnable runnable = new Runnable() { 
       @Override 
       public void run() { 
        // Stop what you want to stop 
       } 
      } 
      handler.postDelayed(runnable, 2*60*1000 /* Wait 2 minutes */); 
      isButtonAlreadyClicked = false; 
     } 
}); 

EDIT:

Если вы хотите, чтобы предотвратить исполняемым для запуска во время ожидания, просто убедитесь, что объявить обработчик и ваши runnables вне вашего метода (внутри класса), так что вы можете сделать (например):

mHandler.removeCallbacks(firstRunnable); 
mHandler.removeCallbacks(secondRunnable); 

таким образом он не будет работать Runnables больше.

+0

У меня есть путаница. Этот метод 'postDelayed()' каким-то образом запускается в новом потоке, который должен быть явно остановлен? Или это похоже на 'Thread.sleep()'? –

+0

Нет, он не заснет. Он будет просто ждать, как «в фоновом режиме», за указанное количество миллисекунд, а затем делать то, что находится внутри вашей runnable. Это будет сделано в потоке, на котором вы создали обработчик. Опять же, он не будет блокироваться. – xdevs23

+0

Факт, как я могу убить эту тему. Когда я снова запускаю эту кнопку, так бывает, что мои данные (собранные в предыдущем сеансе кликов) добавляются в новый сеанс. Я редактирую вопрос с логикой сбора данных, может быть, это и есть моя проблема. –

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