0
如何从内部调用的SensorManager -从AsyncTask调用SensorManager?
protected String doInBackground(String... params) {
.....
}
我必须登录到一个文件acclerometer数据。此应用程序在后台运行。因此我使用AsyncTask来实现它。我需要按下按钮(onClick)来启动和停止日志记录。任何指针都会有帮助!
这是更新...写入的文件是空的...如何开始日志记录?
public class AsyncTaskActivity extends Activity implements SensorEventListener{
Button btn;
File root = Environment.getExternalStorageDirectory();
StringBuilder builder = new StringBuilder();
File gpxfile = new File(root, "TestFile.txt");
String fileText = "Data";
FileWriter gpxwriter;
BufferedWriter out;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btn = (Button) findViewById(R.id.button1);
btn.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
new LongOperation(new AsyncTaskActivity()).execute("");
}
});
}
private class LongOperation extends AsyncTask<String, Void, String> {
private AsyncTaskActivity mActivity;
public LongOperation (AsyncTaskActivity activity) {
mActivity = activity;
}
@Override
protected String doInBackground(String... params) {
try {
gpxwriter = new FileWriter(gpxfile);
out = new BufferedWriter(gpxwriter);
if (root.canWrite()){
SensorManager manager = (SensorManager) mActivity.getSystemService(Context.SENSOR_SERVICE);
Sensor accelerometer = manager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
if(!manager.registerListener((SensorEventListener) this, accelerometer, SensorManager.SENSOR_DELAY_GAME)){
System.out.println("Could not start!!!!!!!!!");
}
out.write("Start");
out.newLine();
out.close();
}
} catch (IOException e) {
Log.e("doIn","Could not write file " + e.getMessage());
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(String result) {
TextView txt = (TextView) findViewById(R.id.output);
txt.setText("File written successfully!!!");
}
@Override
protected void onPreExecute() {
}
@Override
protected void onProgressUpdate(Void... values) {
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// TODO Auto-generated method stub
}
@Override
public void onSensorChanged(SensorEvent event) {
// TODO Auto-generated method stub
builder.setLength(0);
builder.append(event.values[0]+","+event.values[1]+","+event.values[2]);
try {
out.append(builder.toString());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
@Rajdeep感谢您的帮助。如果可能的话,我对编程新手可以帮助我吗? – Fox 2012-03-13 05:36:54
如果您只在一次性练习中记录传感器的数据,那么'AsynTask'是合理的。但是如果你想不断地在后台获取传感器的数据,那么** Service **是一个更好的选择,再加上一个'HandlerThread'。在这种情况下'AsynTask'不起作用。 – ChuongPham 2013-12-28 17:02:37