我正在编写一个Android应用程序来记录所有传感器数据,但是在可变时间段应用程序不断崩溃传感器服务死亡日志之后,智能手机似乎重置了自己。 我的logcat看起来像这样:
I/sensorLis﹕ added MPL Accelerometer
I/sensorLis﹕ added MPL Gyroscope
I/sensorLis﹕ added Corrected Gyroscope Sensor
I/sensorLis﹕ added MPL Magnetic Field
I/sensorLis﹕ added MPL Gravity
I/sensorLis﹕ added Gravity Sensor
I/sensorLis﹕ added MPL Rotation Vector
I/sensorLis﹕ added Rotation Vector Sensor
D/dalvikvm﹕ GC_CONCURRENT freed 509K, 7% free 9687K/10375K, paused 6ms+4ms
D/dalvikvm﹕ GC_CONCURRENT freed 416K, 7% free 9674K/10375K, paused 9ms+1ms
D/dalvikvm﹕ GC_CONCURRENT freed 405K, 7% free 9676K/10375K, paused 13ms+4ms
D/dalvikvm﹕ GC_CONCURRENT freed 391K, 7% free 9676K/10375K, paused 4ms+1ms
D/dalvikvm﹕ GC_CONCURRENT freed 406K, 7% free 9677K/10375K, paused 5ms+3ms
D/dalvikvm﹕ GC_CONCURRENT freed 405K, 7% free 9678K/10375K, paused 6ms+6ms
D/dalvikvm﹕ GC_CONCURRENT freed 395K, 7% free 9681K/10375K, paused 1ms+2ms
D/dalvikvm﹕ GC_CONCURRENT freed 412K, 7% free 9680K/10375K, paused 9ms+3ms
D/dalvikvm﹕ GC_CONCURRENT freed 407K, 7% free 9679K/10375K, paused 3ms+3ms
D/dalvikvm﹕ GC_CONCURRENT freed 404K, 7% free 9681K/10375K, paused 6ms+3ms
D/dalvikvm﹕ GC_CONCURRENT freed 414K, 7% free 9689K/10375K, paused 8ms+3ms
D/dalvikvm﹕ GC_CONCURRENT freed 422K, 7% free 9680K/10375K, paused 4ms+4ms
D/dalvikvm﹕ GC_CONCURRENT freed 393K, 7% free 9680K/10375K, paused 4ms+2ms
D/dalvikvm﹕ GC_CONCURRENT freed 395K, 7% free 9690K/10375K, paused 6ms+6ms
D/dalvikvm﹕ GC_CONCURRENT freed 420K, 7% free 9682K/10375K, paused 5ms+2ms
D/dalvikvm﹕ GC_CONCURRENT freed 409K, 7% free 9680K/10375K, paused 4ms+3ms
D/dalvikvm﹕ GC_CONCURRENT freed 399K, 7% free 9680K/10375K, paused 6ms+5ms
D/dalvikvm﹕ GC_CONCURRENT freed 393K, 7% free 9682K/10375K, paused 6ms+2ms
D/dalvikvm﹕ GC_CONCURRENT freed 412K, 7% free 9680K/10375K, paused 5ms+3ms
D/dalvikvm﹕ GC_CONCURRENT freed 387K, 7% free 9681K/10375K, paused 6ms+3ms
W/Sensors﹕ sensorservice died [0x1e56260]
I/ActivityThread﹕ Removing dead content provider: settings
E/InputQueue-JNI﹕ channel '41d3d498 com.edu.jirka.naviin/com.edu.jirka.naviin.Navin (client)'
在崩溃的时候,我只有几个SensorDataSaver
作为听众运行5到90秒的时间。
import android.app.Activity;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.util.Log;
import android.widget.Toast;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
/**
* Created by Jirka on 8/21/2015.
*
* - designed for sensor data saving to files on external storage
*/
public class SensorDataSaver implements SensorEventListener{
private SensorManager mSensorManager;
private BufferedWriter bw;
private Sensor mSensor;
/**
* class designed to save data of any 3D individual sensor.
*
* @param ma - activity for SensorManager, Resources access
* @param header - basic info about sensor
* @param ssr - sensor to by listen to
*/
public SensorDataSaver(Activity ma, String header, Sensor ssr, File sampleDir) {
mSensor = ssr;
mSensorManager = (SensorManager) ma.getSystemService(Context.SENSOR_SERVICE);
try {
// Header creation
File mFile = new File(sampleDir, mSensor.getName().replace(" ", "_") + "_Data.txt");
bw = new BufferedWriter(new FileWriter(mFile));
bw.write(header);
bw.append("Timestamp X_axis Y_axis Z_axis Current Accuracy\n");
}catch (NullPointerException n){
Log.e("File_Err","Fault during creating output file");
} catch (IOException e) {
Log.e("BuffW_Init","Fault during BufferedWriter init");
e.printStackTrace();
}
}
public void startCollecting(int del){
mSensorManager.registerListener(this,mSensor,del);
Log.i("sensorLis","added " + mSensor.getName());
}
public void finishCollecting(){
// deploy listener
mSensorManager.unregisterListener(this);
// close file
try {
bw.close();
} catch (IOException e) {
Log.e("BuffW_Close","Fault during BufferedWriter closing");
e.printStackTrace();
}
}
/* onSensorChanged method of SensorListener */
public void onSensorChanged(SensorEvent se) {
try {
bw.append(se.timestamp + " " + se.values[0] + " "
+ se.values[1] + " " + se.values[2] + " " + se.sensor.getPower() + " "
+ se.accuracy);
bw.newLine();
}catch (IOException e) {
e.printStackTrace();
Log.e("BW_APPEND",mSensor.toString() + " fault during appending sensor changes");
}
}
/* onAccuracyChanged method of SensorListener */
public void onAccuracyChanged(Sensor sensor, int accuracy) {
/* accuracy changes omitted due to accuracy logging in onSensorChanged
try {
bw.append("Accuracy " + sensor.getName() + " -> " + accuracy);
bw.newLine();
}catch (IOException e) {
e.printStackTrace();
Log.e("BW_APPEND", "Fault during appending accuracy changes");
}*/
}
}
那你有没有想过如何减少GC动作并防止传感器服务死亡? 我需要能够将传感器数据记录至少10分钟。
感谢。
答案 0 :(得分:1)
那你有没有想过如何减少GC动作并防止传感器服务死亡?
我首先要清理onSensorChanged()
,因为这将被调用很多,并且摆脱内存搅拌字符串连接:
public void onSensorChanged(SensorEvent se) {
try {
bw.append(se.timestamp);
bw.append(" ");
bw.append(se.values[0]);
bw.append(" ");
bw.append(se.values[1]);
bw.append(" ");
bw.append(se.values[2]);
bw.append(" ");
bw.append(se.sensor.getPower());
bw.append(" ");
bw.append(se.accuracy);
bw.newLine();
} catch (IOException e) {
Log.e("BW_APPEND", mSensor.toString() + " fault during appending sensor changes", e);
}
}
除此之外,使用开发工具确定您花费时间和RAM的位置。例如,Android Studio可以帮助您跟踪CPU使用情况和内存分配。