有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在收到截击响应后执行该方法

当我运行以下代码时, 我在日志中得到“空白”,而我希望它“截击结果”设置为截击请求生成的响应

然而,当我第二次运行相同的代码时,它显示正确

那么,如何在“courses”方法中保留“Log.i(-)”,直到截击结果到达为止

我有几种类似“课程”的方法,它们之间唯一的区别是它们调用的URL。 此外,它们都充当“OnButtonClickListner”,所以在“req”中调用“courses”不是一个选项

    String volleyResult = "blank";

    public void courses(View view) {
        String url = "http://courses/list.json";
        reqReturn(url, "Courses");
        Log.i("Volley Res", volleyResult);    
    }


    public void req(String url, final String type ) {

    StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    volleyResult = response;
                }
            }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            volleyResult = "error";
        }
    }) {
        @Override
        public Map<String, String> getHeaders() throws AuthFailureError {
            HashMap<String, String> headers = new HashMap<String, String>();
            headers.put("Cookie", cookie);
            return headers;
        }
    };
    queue.add(stringRequest);

    }

共 (3) 个答案

  1. # 1 楼答案

    在onResponse()中调用courses()

    编辑以澄清:

    你在回复中填写var截击结果。听众。这是异步的,所需时间取决于服务器延迟和internet连接。有几种方法可以“保持”你的处理方法,这些方法需要截击结果

    最简单的方法: 移动进程(在你的例子中是Log.i(“截击结果”,截击结果)在onResponse方法中,将响应存储在volleyResult中之后

    稍微干净一点: 将代码移动到新函数中,并从响应中调用它。侦听器方法:

    @Override
    public void onResponse(String response) {
      volleyResult = response;
      methodToHoldUntilResponseArrived();
    }
    
    public void methodToHoldUntilResponseArrived(){
      // your code that relies on the volley response
      Log.i("Volley Res", volleyResult);
    }
    

    如果您的courses方法被反复调用:您可以在收到数据时设置一个标志,并将代码放在if条件块的courses()中:

    private boolean mHasReceivedData = false;
    @Override
    public void onResponse(String response) {
      volleyResult = response;
      mHasReceivedData = true;
    }
    
    public void courses(View view){
      // your code that relies on the volley response
      if(mHasReceivedData){
            Log.i("Volley Res", volleyResult);
      }
    }
    
  2. # 2 楼答案

    使用OnResponse()方法打印日志。 如果OneRorResponse()方法中发生超时错误,请再次调用相同的API

  3. # 3 楼答案

    轻松放置日志。onResponse方法中的i()

    另一个选项是使用wait()/notify()。你需要一个监控对象来处理一切

     public synchronized void courses(View view) {
        String url = "http://courses/list.json";
        reqReturn(url, "Courses");
        wait();
        Log.i("Volley Res", volleyResult);    
    }
    

    作为回应

    public void onResponse(String response) {
                    volleyResult = response;
                    YourClass.this.notify();
                }