2013-01-23 5 views
1

Я просто пытаюсь записать данные акселерометра и написать файл в SD-карте нажатием кнопки. Во время запуска приложения в моем Nexus S (с 4.1.2) он замораживается через минуту. Я попытался запустить его в телефоне Galaxy Nexus, и он работает плавно. По некоторым причинам я должен работать в Nexus S. Может кто-нибудь предложить мне, что может быть причиной сбоя. Я попытался просмотреть журнал, но это не связано с каким-либо сообщением об ошибке.Приложение зависает во время записи данных акселерометра: Android

Вот мой код:

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 
+0

Операции с файлами, по-видимому, выполняются в потоке пользовательского интерфейса. Вероятно, это причина зависаний. Для этой цели рассмотрите использование Thread или AsyncTask. –

+0

Хорошо спасибо за предложение. Я делаю это. – Pow

+0

Ну, я попробовал добавить подкласс и вызвал метод execute сразу после 'acc + =" \ n "+ miliSec() +", "+ xAxis_lateralA +", "+ yAxis_longitudA +", "+ zAxis_verticalA;' .. Не чувствуя никаких разница. – Pow

ответ

1

Издание связано с тем, как ваши ценности записи в текстовый файл.

Вы открываете/записываете/закрываете файл каждый раз, когда получаете считывание сенсора.

Даже для частоты считывания датчика 50 Гц требуется много вычислений, запись их в тексте в течение 50 раз/сек неэффективна.

Используйте BufferedWriter, он дает лучшую производительность.