2

我目前正在 Android 中开发一个应用程序,它将在固定的时间长度内记录几个周期的传感器数据。比如我打算记录数据10秒,然后停下,让手机休息10秒,然后重新开始记录,……以这种模式工作1小时。我的问题是,如何让手机自动执行这个计划?我目前正在使用以下代码(来自Android:如何在固定时间段内收集传感器值?),但它仅适用于一个周期,我必须在确定前一个周期完成后手动启动新周期。

public void onResume() {
mSensorManager.registerListener(mListener, mSensorAcceleration, SensorManager.SENSOR_DELAY_GAME);
mSensorManager.registerListener(mListener, mSensorMagnetic, SensorManager.SENSOR_DELAY_GAME);
Handler h = new Handler();
h.postDelayed(new Runnable() {

    @Override
    public void run() {
    //    do stuff with sensor values
        mSensorManager.unregisterListener(mListener);               
    }
}, 10000);

...

任何帮助将不胜感激!!

4

2 回答 2

2

我认为有更好,更正确的方法来实现这一点。具体来说,我认为让Activity实施是错误的Runnable。它在其公共接口中泄漏了应该保持私有(和隐藏)的逻辑。即,任何人都不应该run()在活动之外调用。我建议按如下方式实现它:

public class PostDelayedDemo extends Activity {
  // Declaration of sensor-related fields.

  private static final int PERIOD = 10000;
  private Handler handler;
  private final Runnable processSensors =
      new Runnable() {
         @Override
         public void run() {
           mSensorManager.registerListener(mListener, mSensorAcceleration, SensorManager.SENSOR_DELAY_GAME);
           mSensorManager.registerListener(mListener, mSensorMagnetic, SensorManager.SENSOR_DELAY_GAME);

           // Do work with the sensor values.

           mSensorManager.unregisterListener(mListener);

           // The Runnable is posted to run again here:
           handler.postDelayed(this, PERIOD);
         }
      };

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    handler = new Handler();
  }

  @Override
  public void onResume() {
    super.onResume();

    handler.post(processSensors);
  }

  @Override
  public void onPause() {
    handler.removeCallbacks(processSensors);

    super.onPause();
  }
}
于 2012-11-10T22:24:25.923 回答
0

步骤#1:让您的活动实现Runnable,而不是使用匿名内部类,移动您的run()方法以在活动上实现。

第 2 步:在您的run()方法中,使用postDelayed(). 这加上您对 的现有调用postDelayed(),将有效地设置对 的定期调用run()

第 3 步:跟踪您是处于“传感器开启”还是“传感器关闭”模式,并且在 中run(),根据需要注册或取消注册侦听器。

第 4 步:在onPause()中,呼吁removeCallbacks()Handler停止对 的定期调用run()

您将在此示例项目中看到这种自行安排再次运行逻辑的示例。这是活动:

package com.commonsware.android.post;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;

public class PostDelayedDemo extends Activity implements Runnable {
  private static final int PERIOD=5000;
  private View root=null;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    root=findViewById(android.R.id.content);
  }

  @Override
  public void onResume() {
    super.onResume();

    run();
  }

  @Override
  public void onPause() {
    root.removeCallbacks(this);

    super.onPause();
  }

  @Override
  public void run() {
    Toast.makeText(PostDelayedDemo.this, "Who-hoo!", Toast.LENGTH_SHORT)
         .show();
    root.postDelayed(this, PERIOD);
  }
}
于 2012-11-10T13:32:05.813 回答