Android:Volley字符串请求onresponse未被调用


Android: Volley String request onresponse is not called

我正试图使用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); 
    ?>

这是安卓代码:

初始化测试字符串以显示输出

String test = "none";

这就是我称之为的方法

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

您遇到了并发问题。当您执行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();
}

检查您是否获得了互联网权限。

在中添加吐司

onResponse()
 Toast.makeText(LoginActivity.this, response.toString(), Toast.LENGTH_LONG).show();