我已经编写了一项在后台记录加速度计值的服务。想法是注册传感器侦听器并将值写入存储。我已经启用了StrictMode.enableDefaults()
在MainActivity
应用程序(不在服务)的检查,如果在自己的线程在服务运行。但事实并非如此!我不知道问题出在哪里...我有AsyncTask
一个我希望解决这个问题的类,但是显然没有(这是在服务内部,并且它的execute方法是从服务的方法中调用onCreate
的)。
private class LogTask extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... voids) {
mListener = new SensorEventListener() {
@Override
public void onSensorChanged(SensorEvent sensorEvent) {
String formatted = String.valueOf(System.currentTimeMillis())
+ "\t" + String.valueOf(sensorEvent.timestamp)
+ "\t" + String.valueOf(sensorEvent.values[0])
+ "\t" + String.valueOf(sensorEvent.values[1])
+ "\t" + String.valueOf(sensorEvent.values[2])
+ "\r\n";
//if (mIsServiceStarted && mFileStream != null && mLogFile.exists()) {
if (mFileStream != null && mLogFile.exists()) {
try {
mFileStream.write(formatted.getBytes());
} catch (IOException e) {
e.printStackTrace();
}
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
};
mSensorManager.registerListener(
mListener, mSensor, SensorManager.SENSOR_DELAY_FASTEST
);
return null;
}
}
log cat中的StrictMode特别指出以下行使该策略无效:
mFileStream.write(formatted.getBytes());
StrictMode policy violation; ~duration=0 ms: android.os.StrictMode$StrictModeDiskWriteViolation: policy=31 violation=1
at android.os.StrictMode$AndroidBlockGuardPolicy.onWriteToDisk(StrictMode.java:1092)
有人可以告诉我出什么事了吗?如果需要,这是我的服务的完整代码:http : //pastebin.com/NRm376BL
我发现问题是,我应该创建一个HandlerThread
和一个Handler
并将处理程序传递给registerListener
方法的重载。如果不提供此参数,则监听器将由主线程处理,大多数情况下,这不是您要查找的内容。
对于示例实现,请检查以下代码:特别是用于处理其他线程(而不是主线程)上的传感器侦听器
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句