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

时间:2016-02-17 14:20:14

标签: java android android-volley

当我运行以下代码时, 我得到了#34;空白"在日志中,我想要它' volleyResult'被设置为由截击请求生成的响应。

但是,当我第二次运行相同的代码时,它会正确显示。

那么,如何保持" Log.i( - )"在'课程'执行的方法,直到volleyResult到达。

我有几种方法就像' courses',它们之间唯一的区别就是他们调用的URL。 此外,他们都作为' OnButtonClickListner',所以呼叫'课程'在里面' req'不是一个选择。

    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 个答案:

答案 0 :(得分:2)

在onResponse()

中调用courses()

修改以澄清:

您在Response.Listener中填充var volleyResult。这是异步的,所需的时间取决于服务器延迟和您的Internet连接。有几种方法可以保持&#34;你需要在volleyResult中得到结果的处理方法。

最简单的方法: 在volleyResult中存储响应后,在onResponse方法中移动进程(在您的情况下为 Log.i(&#34; Volley Res&#34;,volleyResult);

有点清洁: 将您的代码移动到一个新函数中,并从您的Response.Listener方法中调用它:

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

如果你的课程方法被反复调用:你可以在收到数据时设置一个标志,并将你的代码放在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);
  }
}

答案 1 :(得分:0)

Easyway - 将Log.i()置于onResponse方法

其他选项是使用wait()/ notify()。你需要一个监视器对象来处理所有事情。

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

并在onResponse

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

答案 2 :(得分:0)

在OnResponse()方法上打印LOG。 如果在OnErrorResponse()方法中发生超时错误,也会再次调用Same API。