1

私は単に加速度計のデータを記録し、ボタンをクリックしてSDカードにファイルを書き込もうとしています。Nexus S (4.1.2) でアプリを実行すると、1 分後にフリーズします。Galaxy Nexus 電話で実行しようとしましたが、スムーズに動作します。何らかの理由で、Nexus S で作業する必要があります。クラッシュの原因を教えてください。ログを表示しようとしましたが、エラー メッセージが表示されません。

これが私のコードです:

final SensorEventListener mySensorEventListener = new SensorEventListener() { 
    public void onSensorChanged(SensorEvent sensorEvent) {
        if (sensorEvent.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
            xAxis_lateralA = sensorEvent.values[0]; 
            yAxis_longitudinalA = sensorEvent.values[1]; 
            zAxis_verticalA = sensorEvent.values[2]; // TODO apply the acceleration changes to your application.
            textView.append("\nACC_x = "+ xAxis_lateralA + ", ACC_y = "+yAxis_longitudinalA+ ", ACC_z = " + zAxis_verticalA);

            acc += "\n"+miliSec()+", "+xAxis_lateralA + ", "+ yAxis_longitudinalA+", "+zAxis_verticalA;

            try {
                File myFile = new File("/sdcard/acc.txt");
                myFile.createNewFile();
                FileOutputStream fOut = new FileOutputStream(myFile);
                OutputStreamWriter myOutWriter = new OutputStreamWriter(fOut);
                myOutWriter.append(acc);
                myOutWriter.close();
                fOut.close();

            } catch (Exception e) {
                Toast.makeText(getBaseContext(), e.getMessage(), Toast.LENGTH_SHORT).show();
            }
        }
    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {
        // TODO Auto-generated method stub

    }
};

startButton.setOnClickListener(new OnClickListener() {
    public void onClick(View v) {
        Toast.makeText(getBaseContext(),"Done writing SD 'acc.txt'",Toast.LENGTH_SHORT).show();
        sm = (SensorManager)getSystemService(Context.SENSOR_SERVICE); 
        int sensorType = Sensor.TYPE_ACCELEROMETER; 
        sm.registerListener(mySensorEventListener,sm.getDefaultSensor(sensorType), SensorManager.SENSOR_DELAY_NORMAL);

    }// onClick
}); // btnWriteSDFile 


stopButton = (Button) findViewById(R.id.stopButton);

stopButton.setOnClickListener(new OnClickListener() {

    public void onClick(View v) {

        int sensorType = Sensor.TYPE_ACCELEROMETER;
        sm.unregisterListener(mySensorEventListener, sm.getDefaultSensor(sensorType));
        Toast.makeText(getBaseContext(), "Stopped Recording",Toast.LENGTH_SHORT).show();
        finish();

    }// onClick
}); // btnstopButton
4

1 に答える 1

1

問題は、値をテキスト ファイルに書き込む方法が原因です。

センサーの読み取りを取得するたびに、ファイルを開いたり、書き込んだり、閉じたりしています。

センサーの読み込み周波数が50Hzでも計算量が多く、50回/秒のテキスト書き込みは効率的ではありません。

BufferedWriterを使用すると、パフォーマンスが向上します。

于 2013-01-25T18:20:03.397 に答える