【问题标题】:android post request using volley使用 volley 的 android 发布请求
【发布时间】:2017-10-27 12:27:21
【问题描述】:

我在我的 android 代码中使用了 Volley、HttpClient 和 HttpUrlConnection,这些代码从传感器管理器获取传感器指标。我需要通过 POST 请求将这些指标导出到 nodejs 服务器。每当传感器值发生变化时,我都需要一个发布请求以异步发送到 http 服务器

MainActivity.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]));

}
}

server.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}`)
});

我无法看到来自服务器的任何响应...??

【问题讨论】:

  • 好的,你的nodejs服务器或者你的android代码可能有错误。
  • 是的,我知道...它在 android 控制台或 js 控制台中没有显示任何内容。我在 onSensorChanged 方法中编写了 http 请求,我认为可能在某处
  • nodejs 服务器正在打印任何其他使用邮递员检查过的请求

标签: java android node.js rest


【解决方案1】:

您创建了请求对象,但从未将其发送到服务器。
您应该为它设置一个请求队列。

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

【讨论】:

  • 我用这个 RequestQueue queue = Volley.newRequestQueue(this); 替换了队列实例化我收到权限被拒绝错误
  • 您应该获得以下链接中描述的网络权限。 developer.android.com/training/volley/simple.html .. 在继续之前,我几乎不建议您查看此链接
【解决方案2】:

在您的网址中,尝试使用http://10.0.2.2/ 而不是http://localhost

这将在模拟器中工作。

【讨论】:

  • 谢谢。我用我的主机wifi ip替换了localhost。现在可以使用了,谢谢!