【问题标题】:Service or Asynctask for sampling sensors in Android?Android中采样传感器的服务或异步任务?
【发布时间】:2013-12-23 16:45:53
【问题描述】:

我必须从加速度计、陀螺仪、麦克风和 GPS 等各种传感器获取数据。 传感动作不应该是连续的,而是应该根据各种策略(例如省电)定期安排单个短间隔的采样。每个传感器采样动作持续几秒钟,比如说 5 秒钟。 我会为每个传感器实现一个“客户端”,在必要时负责监听传感器数据,以及一个控制客户端执行的“控制器”,但我不确定如何实现这一点。

为每个客户实现一个服务是否正确?还是一个简单的 AsyncTask 或 Handler 会更好?

最好每个客户端负责一个单一的感知动作,在一个单一的 onStartService() 中执行,或者如果 onStartService() 动作启用一个周期性的采样动作? 帮助将不胜感激。

【问题讨论】:

    标签: android android-service android-sensors


    【解决方案1】:

    这听起来像是Service 的任务,由Alarms 在(定期)预定的时间间隔触发。

    AsyncTask 通常是在用户完成一些交互并且系统应该执行“长时间运行”操作(如网络 i/o)之后启动的,否则可能会阻塞 UI。

    请注意,也很有可能触发 AsyncTask 之类的服务 - 请查看 IntentService

    【讨论】:

    • 那么Controller控制每个Service执行的每个单个感知动作的调度正确设置每个Client的重复周期?很好听!非常感谢!
    • 是的,当然每个客户端都会产生它自己的线程来计算感知动作,所以我将为某些客户端使用 Intent 服务,或者为其他客户端使用 Looper/Handler(如果传感器事件在侦听器中调度) .此外,所有这些组件(控制器和客户端)都与 UI 元素完全分离,因为它们在单独的进程中运行,甚至不与 UI 通信。
    • 经过进一步阅读,似乎警报被设想为更零星的周期性。就我而言,这些事件的安排时间为 30 秒到 30 分钟。这样反复使用闹钟可以吗?现在我正在使用 Java 中的 Timer ..
    【解决方案2】:

    我建议您在这里查看我对类似问题的回答:Service v/s AsyncTask

    就我个人而言,我会使用一个简单的Handler 来发布一个任务以在特定的时间间隔内运行。

    例子:

    private Handler mHandler = new Handler();
    
    private void startTimer(Runnable Task, long delay) {  
        mHandler.removeCallbacks(Task);       
        mHandler.postDelayed(Task, delay);    
    }
    
    private void stopTimer(Runnable Task) {  
        mHandler.removeCallbacks(Task);       
    }
    
    private Runnable registerListeners = new Runnable() {
        public void run() {
            startTimer(registerListeners, 10*60*1000); //register to run again in 10 minutes
            startTimer(unregisterListeners, 5*1000); //to unregister in 5 seconds 
            //here register your listeners
        }
    };
    
    private Runnable unregisterListeners = new Runnable() {
        public void run() {
            //here unregister your listeners
        }
    };
    

    当你想开始监听过程时:

    //To start you listeners
    startTimer(registerListeners, 0);
    

    当你想停止一切时:

    //To stop registering/unregistering listeners
    stopTimer(registerListeners);
    

    注意:如果您在侦听器中执行长时间运行的代码,那么您应该查看我上面给出的链接中的答案。

    问候。

    【讨论】:

      【解决方案3】:

      【讨论】:

      • 虽然这些链接可能会回答问题,但最好包含答案的基本部分here 并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-23
      • 2013-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多