Java Android:未调用截击字符串请求onresponse

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'];

我正在尝试使用POST方法将数据从android发送到php

php部分是单独测试的,它100%正常工作,并按预期返回json字符串

android部分不工作 它不会打印错误 甚至是要求的回应

这是经过测试的代码,使用Toast打印一个字符串“test”,但在截取代码中没有更改:(

这是php代码:

<?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();
}