2013-01-23 4 views
1

나는 가속도계 데이터를 기록하고 버튼 클릭으로 sdcard에 파일을 쓰려고합니다. 내 Nexus S (4.1.2 포함)에서 앱을 실행하는 동안 1 분 후에 앱이 정지됩니다. 나는 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

파일 작업이 UI 스레드에서 수행 된 것 같습니다. 아마도 그 원인이 될 수 있습니다. 이를 위해 Thread 또는 AsyncTask 사용을 고려하십시오. –

+0

제안 해 주셔서 감사합니다. 나는 총을주고있다. – Pow

+0

음, 서브 클래스 추가를 시도하고'acc + = "\ n"+ miliSec() + ","+ xAxis_lateralA + ","+ yAxis_longitudinalA + ","+ zAxis_verticalA; "바로 뒤에 execute 메소드를 호출했습니다. 차이. – Pow

답변

1

문제는 다음과 같습니다

여기 내 코드입니다.

센서를 읽을 때마다 파일을 열거 나 쓰거나 닫는 중입니다.

센서 읽기 주파수가 50Hz 인 경우에도 50 회/초의 속도로 텍스트를 작성하는 것은 많은 계산량을 필요로합니다.

BufferedWriter을 사용하면 성능이 향상됩니다.