我在我的 android 代码中使用了 Volley、HttpClient 和 HttpUrlConnection,它们从传感器管理器获取传感器指标。我需要通过 POST 请求将这些指标导出到 nodejs 服务器。每当传感器值发生变化时,我都需要一个异步发送到 http 服务器的 post 请求
主 Activity .java
package com.example.rpothuraju.gyrometrics;
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.util.Log;
import android.widget.TextView;
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
public class MainActivity extends Activity implements SensorEventListener{
TextView textView;
private SensorManager sensorManager;
//private Sensor sensor;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView) findViewById(R.id.metrics);
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;
}
String url ="http://localhost:8080/?X=" + event.values[0] + "&&Y= " + event.values[1] + "&&Z=" + event.values[2];
StringRequest stringRequest = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.i("VOLLEY", response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e("VOLLEY", error.toString());
}
});
textView.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]));
}
}
服务器.js
const util = require('util');
const http = require('http');
const port = 8080;
var server = http.createServer(function(request, response) {
response.setHeader('Access-Control-Allow-Origin', '*');
response.setHeader('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
response.setHeader('Access-Control-Allow-Headers', 'Content-Type');
var values = (request.url).replace(/[`~!@#$%^&*()_|+\-?;:'",.<>\{\}\[\]\\\/]/gi, '');
response.end(values);
console.log(values);
});
server.listen(port, (err) => {
if (err) {
return console.log('something bad happened', err)
}
console.log(`server is listening on ${port}`)
});
我看不到服务器的任何响应...??
最佳答案
您创建请求对象但从未将其发送到服务器。
您应该为它设置一个请求队列。
RequestQueue queue;
//inside the oncreate method
queue = Volley.newRequestQueue(mCtx.getApplicationContext());
//and for sending request
String url ="http://localhost:8080/?X=" + event.values[0] + "&&Y= " + event.values[1] + "&&Z=" + event.values[2];
StringRequest stringRequest = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.i("VOLLEY", response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e("VOLLEY", error.toString());
}
});
<br>
queue.add(stringRequest);
为了更好的方法(为网络请求创建一个单例类)请查看下面的链接,
https://developer.android.com/training/volley/requestqueue.html
关于java - 使用 volley 的 android post 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44204477/