【问题标题】:Android: Volley String request onresponse is not calledAndroid:没有调用 Volley String 请求 onresponse
【发布时间】:2016-09-10 16:35:31
【问题描述】:

我正在尝试使用 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);
    }

【问题讨论】:

  • 你是加断点还是登录onResponse查看是否被调用
  • 您是否等待 5-6 秒让 webrequest 完成并查看是否打印了测试值?

标签: java php android android-volley


【解决方案1】:

您遇到了并发问题。当您执行 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() 中调用它之外还有其他方法吗?
  • 很遗憾,网络请求完成后您想要发生的任何事情都必须从onResponse()调用
【解决方案2】:

检查您是否已获得互联网许可。

中也添加toast
onResponse()
 Toast.makeText(LoginActivity.this, response.toString(), Toast.LENGTH_LONG).show(); 

【讨论】:

  • manifest 中添加了 Internet 权限....它不起作用,它只打印测试变量的初始值
猜你喜欢
  • 2018-01-01
  • 1970-01-01
  • 2021-07-27
  • 1970-01-01
  • 2020-01-27
  • 1970-01-01
  • 2014-08-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多