java - Android:不调用 Volley String 请求 onresponse

标签 java php android android-volley

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

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

android 部分不工作 它不打印错误 甚至所需的响应

这是代码并经过测试,使用 Toast 打印字符串“test”,但它在 volley 代码中没有改变:(

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

关于java - Android:不调用 Volley String 请求 onresponse,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37227632/

相关文章:

java - 获取 spring bean 初始化时间

PHPWord 将一行中的某些单词加粗

android - 如何在卡片 View 中获取 TextView 的引用

java - Scanner 构造函数导致 bufferedReader 返回 null

java - 在 Java 中使用 For 循环和数组计算最终成绩

java - Vertx 连接超时未捕获 JDBCClient (.getConnection)

php - 注册表设计模式...好还是坏?

php - 文件名的字符串清理程序

android - 设置为通知时大图片正在裁剪

android - 我应该在 AsyncTask 中使用 Wea​​kReference<Context> 还是 Application Context?