我正在研究以下代码,我研究了其他问题,例如 AsyncTask Android example 和 How to properly use AsyncTask 但是我还有问题,请你让我知道我错过了什么?非常感谢!!!
因此,在UI中我有一个开始按钮,s停止按钮和一个文本视图。 我从加速计传感器获取数据并存储在csv文件中。 不使用AsyncTask,代码工作正常,但在使用它时(如下所示),我收到此错误:a_datatest无法解析为变量
所以,基本上我想要的是在点击开始按钮后立即开始在后台写入加速度计数据,然后一旦点击停止按钮,文本视图就会显示“数据存储!”
我感谢任何帮助!
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.location.Criteria;
import android.location.LocationManager;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.app.Activity;
import android.content.Context;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends Activity implements SensorEventListener, OnClickListener {
private SensorManager sensorManager;
private LocationManager locationManager;
private Button start_bt;
private Button stop_bt;
private TextView result_view;
private boolean started = false;
String towers;
FileOutputStream fos;
String FILENAME = "AccelOutput";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
Criteria crit = new Criteria();
towers = locationManager.getBestProvider(crit, false);
start_bt = (Button) findViewById(R.id.startButton);
stop_bt = (Button) findViewById(R.id.stopButton);
result_view = (TextView) findViewById(R.id.resultTextView);
start_bt.setOnClickListener(this);
stop_bt.setOnClickListener(this);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
@Override
public void onSensorChanged(SensorEvent event) {
if (started) {
Sensor sensortype = event.sensor;
if (sensortype.getType() == Sensor.TYPE_ACCELEROMETER) {
double a_x = event.values[0];
double a_y = event.values[1];
double a_z = event.values[2];
double a_a = event.accuracy;
double a_ts = event.timestamp;
long a_timestamp = System.currentTimeMillis();
AccelData a_data = new AccelData(a_timestamp, a_ts, a_x, a_y, a_z, a_a);
String a_datatest = a_data.toString();
new writeData().execute();
}
}
}
@Override
public void onClick(View v) {
if (v.getId() == R.id.startButton) {
started = true;
Sensor accel = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
sensorManager.registerListener(this, accel, SensorManager.SENSOR_DELAY_FASTEST);
} else if(v.getId() == R.id.stopButton) {
started = false;
sensorManager.unregisterListener(this);
}
}
private class writeData extends AsyncTask<Void, Void, String>{
@Override
protected String doInBackground(Void... params) {
// TODO Auto-generated method stub
File sdCard = Environment.getExternalStorageDirectory();
File directory = new File (sdCard.getAbsolutePath() + "/output");
directory.mkdirs();
String a_filename = "accelerometer.csv";
File a_file = new File(directory, a_filename);
FileOutputStream a_fOut = null;
try {
a_fOut = new FileOutputStream(a_file, true);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
OutputStreamWriter a_osw = new OutputStreamWriter(a_fOut);
try {
a_osw.write(a_datatest + "\n");
a_osw.flush();
a_osw.close();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(String result) {
result_view.setText("Data Stored!");
}
}
}
答案 0 :(得分:1)
在类范围内声明变量。即将其用作成员变量
您在a_datatest
方法中声明onSensorChanged
,因此它没有超出此范围的有效性。因此,您无法在doInBackGround
方法
在班级内的delcare
private String a_datatest;
onSensorChanged方法中的使用
a_datatest = a_data.toString();
答案 1 :(得分:0)
我认为AsyncTask
是实现这一目标的最佳方式。 AsyncTask
旨在用于一次性操作,例如从服务器下载一组数据。 AsyncTask
启动,在后台执行某些操作,然后报告回UI线程。虽然可以停止AsyncTask
,但它无法按照您想要的方式运行。
我建议只使用Service
。您可以通过按下按钮开始读取值,然后停止Service
点击停止按钮。