2011-03-05 21 views
0

我有一个应用程序在Android中将传感器值转储到手机的SDcard内存,并在我按下屏幕上的按钮时自行关闭。我正在使用Sensor_delay_fastest来获取传感器的最大更新。Android传感器转储响应

我的问题是,因为我在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()中,我在SDcard上写入这些值,这可能会导致延迟。但是我不能把它放在一个不同的线程中,因为随着事件不断发射,它会创建大量的线程。

那么,如何让这个系统更具响应性呢?我对Android非常陌生,并且通过一些示例代码的帮助将不胜感激。

谢谢大家!

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

回答

0

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

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

然后我注册一个Handler对象在其Looper开始之后:

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

从这个角度,我们有一个新的线程我们可以通过它的Handler发送消息。

诀窍是现在将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(停止线程),否则它会耗尽你的电池为空。