2011-03-05 6 views
0

私はAndroidのアプリケーションを持っていて、画面上のボタンを押すとセンサ値を電話のSDカードメモリにダンプして自分自身を殺します。私はセンサーの最大更新を得るためにSensor_delay_fastestを使用しています。Android Sensor Dump Responsiveness

私の問題は、UIスレッドですべての計算を行っているので、ボタンが応答するのに非常に時間がかかることです。アプリケーションでは非常に悪いです。私は別のスレッドに計算を入れておくべきだと理解していますが、イベント処理操作のためにどうすればよいか分かりません。例えば、私は)

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には本当に新しく、いくつかのサンプルコードを使っていくつかの助けを歓迎します。

ありがとうございます!

EDIT:スレッドに、SensorEventListenerのようなインターフェイスをインプリメントし、そのスレッド内のOnResumeとOnStopを含めることができますか?

答えて

0

センサの変化をメモリにキューイングしてから、一定量のデータに達するか、ユーザがボタンを押すと、SDカードに書き込むことができます。あなたがSDカードに書き込む回数を減らすことはおそらくそれをより応答性にするでしょう。

1

私はセンサーも別のスレッドで取得するのが好きです。その後、

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

私はそれを起動した後にそのLooperHandlerオブジェクトを登録する:この時点から

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

我々は新しいスレッドを持っている管理者のためのコンテキストを通過させながら、この目的のために、私はHandlerThreadを作成しましたハンドラを介してメッセージを送信することができます。

これで、SensorManager.registerListener()を、データが計算されるHandlerオブジェクトと共に使用するようになりました。 (SensorThread自身で実装することができます)あなただけのThreadHandlerにSensorEventsを渡すか、何でもそのインタフェースから

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

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

それ以外の場合は、空のバッテリーを消耗します)どちらかをSHUREリスナーの登録を解除したり(sdt.quitを呼び出すことにより、スレッドを停止します。

関連する問題