java - 自动启动和停止方法

标签 java android

因此,我尝试在 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 分钟后停止它。除非我再次按下按钮,否则这种情况只会发生一次。

添加:停止按钮逻辑

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;
            }

最佳答案

当用户第一次按下按钮时:

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 的私有(private) boolean 值。

现在:

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;
        }
});

编辑:

如果您想阻止可运行对象在等待时运行,只需确保在方法外部(在类内部)声明处理程序和可运行对象,以便您可以执行以下操作(例如):

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

这样它就不会再运行 Runnables。

关于java - 自动启动和停止方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39352561/

相关文章:

java - 将父类(super class)实例传递给其构造函数是否是更好的做法?

java - 在具有特定参数的JAVA方法中从xml获取值

java - 无需迭代即可获取 Guava 多重集中元素的实例数

android - 创建签名的 apk 时出现此错误

java - 如何从 Azure 移动服务获取数据

android - Facebook Likeview 不工作

java - 传入对象实例的 boolean 方法,为 return 语句提供错误

java - 为什么同步块(synchronized block)比同步方法更好?

Android:TabHost 在运行时不可见

java - 应用程序激活时重新加载数据