0

我在 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 吗?

4

2 回答 2

1

我也喜欢将传感器放在不同的线程中。为此,我在为 Managers 传递 Context 的同时创建了一个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() 停止线程,否则它将耗尽您的电池电量。

于 2011-05-31T09:38:54.437 回答
0

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

于 2011-03-05T06:28:30.137 回答