【问题标题】:Android Sensor Dump ResponsivenessAndroid 传感器转储响应性
【发布时间】:2013-07-26 06:22:06
【问题描述】:

我在 Android 中有一个应用程序,它将传感器值转储到手机的 SD 卡内存中,并在我按下屏幕上的按钮时自行终止。我正在使用 Sensor_delay_fastest 来最大程度地更新传感器。

我的问题是,由于我在 UI 线程上进行所有计算,因此按钮需要很长时间才能响应,这对我的应用程序非常不利,因为它会在我按下 Kill 按钮后记录所有额外的值。我知道我应该将我的计算放在另一个线程中,但我不确定我将如何为事件处理操作做到这一点。例如,我有

protected void onResume() 
    {
        super.onResume();
        sm.registerListener(this, sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_FASTEST);
        sm.registerListener(this, sm.getDefaultSensor(Sensor.TYPE_ORIENTATION), SensorManager.SENSOR_DELAY_FASTEST);
    }

和 onStop(),以及 onSensorChanged() 和 onAccuracyChanged() 函数,它们在事件触发时执行。实际上,主要的“繁重”计算在我的 onSensorChanged() 中,我在 SD 卡上写入值,这可能导致延迟。但是我不能把它放在不同的线程中,因为这样会在事件不断触发时创建很多线程。

那么如何让这个系统响应更快呢?我真的是 Android 新手,非常感谢您提供一些示例代码的帮助。

谢谢大家!

编辑:我可以让一个线程实现一个接口,例如 SensorEventListener,然后在该线程中实现 OnResume 和 OnStop?

【问题讨论】:

    标签: android multithreading sensors


    【解决方案1】:

    我也喜欢将传感器放在不同的线程中。为此,我创建了一个HandlerThread,同时为经理传递了一个上下文:

    public class SensorDataThread extends HandlerThread implements Handler.Callback{
    
        private Handler mThreadHandler;
        private SensorManager mSensorManager;
    
        private SensorDataThread(Context ctx) {
            super("SensorDataThread", android.os.Process.THREAD_PRIORITY_BACKGROUND);
            mSensorManager = (SensorManager)ctx.getSystemService(Context.SENSOR_SERVICE);
        }
    
        public synchronized void start(){
            super.start();
            mThreadHandler = new Handler(getLooper(), this);
        }            
    
        public boolean handleMessage(Message msg)...
    }
    

    然后我在它的Looper 上注册一个Handler 对象,然后启动它:

    SensorDataThread sdt = new SensorDataThread(this);
    sdt.start():
    

    从这里我们有了一个新的线程,我们可以通过它的处理程序发送消息。

    现在的诀窍是将SensorManager.registerListener() 与一个处理程序对象一起使用,在其中计算数据。

     mSensorManager.registerListener([listener], [type], [delay], mThreadHandler);
    

    从那个接口(可以由 SensorThread 本身实现),您只需将 SensorEvents 或其他任何东西传递给 ThreadHandler。

    public void onSensorChanged(SensorEvent event) {
        mThreadHandler.obtainMessage(MSG_SENSOR_EVENT, event)
        .sendToTarget();    
    }
    

    请务必取消注册侦听器或通过调用 sdt.quit() 停止线程,否则它将耗尽您的电池电量。

    【讨论】:

      【解决方案2】:

      您可以在内存中排队一堆传感器更改,然后仅在达到一定数据量或用户按下按钮时才写入 SD 卡。减少写入 SD 卡的次数可能会使其响应速度更快。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-12
        • 1970-01-01
        • 2021-09-13
        • 1970-01-01
        相关资源
        最近更新 更多