2011-03-05 43 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(停止線程),否則它會耗盡你的電池爲空。