Java Android:未调用截击字符串请求onresponse
我正在尝试使用POST方法将数据从android发送到php php部分是单独测试的,它100%正常工作,并按预期返回json字符串 android部分不工作 它不会打印错误 甚至是要求的回应 这是经过测试的代码,使用Toast打印一个字符串“test”,但在截取代码中没有更改:( 这是php代码:Java Android:未调用截击字符串请求onresponse,java,php,android,android-volley,Java,Php,Android,Android Volley,我正在尝试使用POST方法将数据从android发送到php php部分是单独测试的,它100%正常工作,并按预期返回json字符串 android部分不工作 它不会打印错误 甚至是要求的回应 这是经过测试的代码,使用Toast打印一个字符串“test”,但在截取代码中没有更改:( 这是php代码: <?php require_once(__DIR__.'/../dbConnect.php'); $userName=$_POST['username'];
<?php
require_once(__DIR__.'/../dbConnect.php');
$userName=$_POST['username'];
$query = "SELECT * FROM users WHERE username='$userName'";
$result = pg_query($con, $query);
$rows = pg_num_rows($result);
while ($row = pg_fetch_row($result))
{
$field = pg_num_fields( $result );
for ( $i = 0; $i < $field; $i++ ) {
$name = pg_field_name( $result, $i );
$user_arr[$name] = $row[$i];
}
}
echo json_encode($user_arr);
pg_close($con);
?>
这就是我调用方法的地方
setUserData(username);
Toast.makeText(LoginActivity.this, test, Toast.LENGTH_SHORT).show();
这就是方法:
private void setUserData(final String username)
{
StringRequest strReq = new StringRequest(Request.Method.POST,
Server.GET_USERDATA_URL, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
test= "test = "+response;
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
Toast.makeText(LoginActivity.this, volleyError.getMessage().toString(), Toast.LENGTH_LONG).show();
}
})
{
@Override
protected Map<String, String> getParams() {
// Posting parameters to getData url
Map<String, String> params = new HashMap<String, String>();
params.put(Server.KEY_USERNAME, username);
return params;
}
};
//Creating a Request Queue
RequestQueue requestQueue = Volley.newRequestQueue(this);
//Adding request to the queue
requestQueue.add(strReq);
}
private void setUserData(最终字符串用户名)
{
StringRequest strReq=新的StringRequest(Request.Method.POST,
Server.GET\u USERDATA\u URL,新响应.Listener(){
@凌驾
公共void onResponse(字符串响应){
test=“test=”+响应;
}
},new Response.ErrorListener(){
@凌驾
公共错误响应(截击错误截击错误){
Toast.makeText(LoginActivity.this,volleyError.getMessage().toString(),Toast.LENGTH_LONG.show();
}
})
{
@凌驾
受保护的映射getParams(){
//将参数发布到getData url
Map params=新的HashMap();
参数put(Server.KEY_用户名、用户名);
返回参数;
}
};
//创建请求队列
RequestQueue RequestQueue=Volley.newRequestQueue(this);
//将请求添加到队列
添加(streq);
}
检查您是否已获得互联网许可
同时加入吐司
onResponse()
Toast.makeText(LoginActivity.this, response.toString(), Toast.LENGTH_LONG).show();
您存在并发问题。当您执行
setUserData(username)
方法时,Volley正在后台线程上执行工作。因此,您需要等待响应,然后才能将其显示在Toast中。在您调用时:
Toast.makeText(LoginActivity.this, test, Toast.LENGTH_SHORT).show();
服务器仍然没有响应,test
仍将是none
。您需要从onResponse
回调调用toast:
private void setUserData(final String username) {
StringRequest strReq = new StringRequest(
Request.Method.POST,
Server.GET_USERDATA_URL,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
test = "test = "+response;
showToast();
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
Toast.makeText(LoginActivity.this, volleyError.getMessage().toString(), Toast.LENGTH_LONG).show();
}
})
{
@Override
protected Map<String, String> getParams() {
// Posting parameters to getData url
Map<String, String> params = new HashMap<String, String>();
params.put(Server.KEY_USERNAME, username);
return params;
}
};
//Creating a Request Queue
RequestQueue requestQueue = Volley.newRequestQueue(this);
//Adding request to the queue
requestQueue.add(strReq);
}
private void showToast() {
Toast.makeText(LoginActivity.this, test, Toast.LENGTH_SHORT).show();
}
private void setUserData(最终字符串用户名){
StringRequest strReq=新StringRequest(
Request.Method.POST,
Server.GET_USERDATA_URL,
新的Response.Listener(){
@凌驾
公共void onResponse(字符串响应){
test=“test=”+响应;
showtoos();
}
},
新的Response.ErrorListener(){
@凌驾
公共错误响应(截击错误截击错误){
Toast.makeText(LoginActivity.this,volleyError.getMessage().toString(),Toast.LENGTH_LONG.show();
}
})
{
@凌驾
受保护的映射getParams(){
//将参数发布到getData url
Map params=新的HashMap();
参数put(Server.KEY_用户名、用户名);
返回参数;
}
};
//创建请求队列
RequestQueue RequestQueue=Volley.newRequestQueue(this);
//将请求添加到队列
添加(streq);
}
私人文件{
Toast.makeText(LoginActivity.this,test,Toast.LENGTH_SHORT.show();
}
您是否添加了断点或登录了onResponse
以检查是否调用了它您是否等待了5-6秒等待webrequest完成并查看测试值是否优先?internet权限添加到清单中…它不起作用,它只打印测试变量的初始值我们的答复让我更好地理解了…谢谢你:)我还有一个问题与。。如果有一个方法,我希望在该方法在后台线程中完成工作并完全完成后执行该方法,该怎么办。。我应该在哪里调用另一种方法?除了在'onResponse()
中调用它之外,还有其他方法吗?不幸的是,没有,您希望在网络请求完成后发生的任何事情都必须从onResponse()
中调用
private void setUserData(final String username) {
StringRequest strReq = new StringRequest(
Request.Method.POST,
Server.GET_USERDATA_URL,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
test = "test = "+response;
showToast();
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
Toast.makeText(LoginActivity.this, volleyError.getMessage().toString(), Toast.LENGTH_LONG).show();
}
})
{
@Override
protected Map<String, String> getParams() {
// Posting parameters to getData url
Map<String, String> params = new HashMap<String, String>();
params.put(Server.KEY_USERNAME, username);
return params;
}
};
//Creating a Request Queue
RequestQueue requestQueue = Volley.newRequestQueue(this);
//Adding request to the queue
requestQueue.add(strReq);
}
private void showToast() {
Toast.makeText(LoginActivity.this, test, Toast.LENGTH_SHORT).show();
}