我需要发送传感器值发生变化的帖子请求。它发送了太多请求,因为时间戳(纳秒(的每次更改都会调用该方法。我只需要在更改传感器值时发送请求。我想将当前事件值与以前的事件值进行比较
import android.app.Activity;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.widget.TextView;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
public class MainActivity extends Activity implements SensorEventListener{
TextView metrics,post;
private SensorManager sensorManager;
private float timestamp;
RequestQueue queue;
//private Sensor sensor;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
metrics = (TextView) findViewById(R.id.metrics);
post = (TextView) findViewById(R.id.post);
sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
//sensor = sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE);
}
protected void onResume()
{
super.onResume();
sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD),SensorManager.SENSOR_DELAY_FASTEST);
}
protected void onStop()
{
sensorManager.unregisterListener(this);
super.onStop();
}
public void onAccuracyChanged(Sensor arg0, int arg1)
{
//Do nothing.
}
public void onSensorChanged(SensorEvent event)
{
if (event.accuracy == SensorManager.SENSOR_STATUS_UNRELIABLE)
{
return;
}
metrics.setText("Orientation X (Roll) :"+ Float.toString(event.values[0]) +"n"+
"Orientation Y (Pitch) :"+ Float.toString(event.values[1]) +"n"+
"Orientation Z (Yaw) :"+ Float.toString(event.values[2]));
if ( event.values[0] != || event.values[1] != || event.values[2] != ) {
RequestQueue queue = MySingleton.getInstance(this.getApplicationContext()).
getRequestQueue();
String url ="http://10.46.2.179:8080/?X=" + event.values[0] + "&&Y=" + event.values[1] + "&&Z=" + event.values[2];
StringRequest stringRequest = new StringRequest(com.android.volley.Request.Method.POST, url, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
//post.setText(response);
//Log.i("VOLLEY", response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
//post.setText(error.toString());
//Log.e("VOLLEY", error.toString());
}
});
MySingleton.getInstance(this).addToRequestQueue(stringRequest);
}
}
}
考虑使用传感器批处理,越来越多的智能手机支持它。基本上,事件存储在硬件的队列中,并定期一次性发送到您的应用程序。在那里,您可以在一次通话中比较所有结果。
代码中唯一需要更改的行是:
sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD),SensorManager.SENSOR_DELAY_FASTEST);
添加您定义的第四个参数:
sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD),SensorManager.SENSOR_DELAY_FASTEST, max_report_latency_ns);
此max_report_value在哪里:
当 max_report_latency_ns>0 时,传感器事件不需要在检测到后立即报告。它们可以临时存储在硬件FIFO中并批量报告,只要没有事件延迟超过max_report_latency_ns纳秒即可。也就是说,自上一批以来的所有事件都将立即记录并返回。这减少了发送到 SoC 的中断量,并允许 SoC 在传感器捕获和批处理数据时切换到低功耗模式(空闲(。
在你的onSensorChanged
中执行此操作
private float last_x, last_y, last_z;
@Override
public void onSensorChanged(SensorEvent sensorEvent) {
if (sensorEvent.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
long curTime = System.currentTimeMillis();
// only allow one update every 100ms.
// if ((curTime - lastUpdate) > 150) {
x = 0;
y = 0;
z = 0;
x = sensorEvent.values[0];
y = sensorEvent.values[1];
z = sensorEvent.values[2];
float speed = Math.abs(x + y + z - last_x - last_y - last_z) / diffTime * 10000;
last_x = x;
last_y = y;
last_z = z;
}
}
last_x
、 last_y
、 last_z
将具有您以前的值。希望这有帮助