2016-09-06 6 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; 
      } 

は、しかし、これは決して機能しないと収集にもデータが(新しいデータが以前のデータに連結されて)多少破損しています。

私は間違っていますか?

ありがとうございました。

:もう少し詳細。私はボタンを押してから2秒後にそれを停止してから10秒後にそれを開始したい。これは、ボタンをもう一度押さない限り、一度だけ発生します。

追加されました:停止ボタンロジック

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ボタンを押して2分後に停止してから10秒後に起動したい。これは、ボタンをもう一度押さない限り、一度だけ発生します。 –

+0

あなたのハンドラは論理的に正しいように見えますが、stopメソッドは2分前にちょうど10秒間呼び出されます。あなたが直面している問題は何か? –

答えて

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 */); 

これはで行う必要がありますあなたのボタンの:

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:

あなたはそれだけであなたの方法の外ハンドラとあなたのランナブルを宣言することを確認し、待っている間に実行する実行可能を防止したい場合あなたは(たとえば)を行うことができるように、(自分のクラス内):それはもうランナブルを実行しないであろうそのようにし

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

+0

私は混乱しています。この 'postDelayed()'メソッドは何とか明示的に停止する必要のある新しいスレッドで開始しますか?それとも、 'Thread.sleep()'に似ていますか? –

+0

いいえ、スリープ状態にはなりません。指定された時間(ミリ秒)の間、「バックグラウンド」のように待ってから、あなたの実行可能なものの中に何をしますか。ハンドラを作成したスレッドで実行されます。再び、それはブロックされません。 – xdevs23

+0

事実は、どのようにこのスレッドを殺すのですか?このボタンをもう一度起動すると、以前のクリックセッションで収集したデータが新しいセッションに追加されます。私はデータ収集ロジックで質問を編集しています。おそらくそれが私の問題です。 –

関連する問題