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

センサーも別のスレッドに入れるのが好きです。この目的のために、Manager に 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)...
}

次に、起動後にルーパーにハンドラーオブジェクトを登録します。

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() を呼び出してスレッドを停止してください。そうしないと、バッテリーが空になります。

于 2011-05-31T09:38:54.437 に答える
0

一連のセンサーの変更をメモリにキューに入れ、一定量のデータに達するか、ユーザーがボタンを押したときにのみ SD カードに書き込むことができます。SD カードへの書き込み回数を減らすと、おそらく応答性が大幅に向上します。

于 2011-03-05T06:28:30.137 に答える