2013-01-23 3 views
1

J'essaie simplement d'enregistrer des données d'accéléromètre et d'écrire un fichier dans une carte SD avec un clic sur un bouton. Tout en exécutant l'application dans mon Nexus S (avec 4.1.2), il se fige après une minute. J'ai essayé de l'exécuter dans le téléphone Galaxy Nexus et cela fonctionne bien. Pour certaines raisons, je dois travailler dans Nexus S. Quelqu'un peut-il me suggérer ce qui pourrait être la raison de s'écraser. J'ai essayé de voir le journal, mais ce n'est pas par un message d'erreur.L'application se bloque lors de l'enregistrement des données d'accéléromètre: Android

Voici mon code:

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

Les opérations sur les fichiers semblent être effectuées sur le thread UI. C'est probablement la cause des blocages. Envisagez d'utiliser un Thread ou un AsyncTask à cette fin. –

+0

Ok merci pour la suggestion. Je donne un coup de feu. – Pow

+0

Eh bien, j'ai essayé d'ajouter une sous-classe et j'ai appelé la méthode execute juste après 'acc + =" \ n "+ miliSec() +", "+ xAxis_lateralA +", "+ yAxis_longitudinalA +", "+ zAxis_verticalA; différence cependant. – Pow

Répondre

1

est question en raison de la façon dont vos valeurs d'écriture dans un fichier texte.

Vous ouvrez/écrivez/fermez le fichier à chaque fois que vous obtenez la lecture du capteur.

Même pour la fréquence de lecture du capteur de 50Hz, il faut un calcul de lot, l'écriture dans le texte pour 50 fois/seconde n'est pas efficace. Utilisez BufferedWriter, il donne de meilleures performances.

Questions connexes