当我运行下面的代码时, 我在日志中得到“空白”,而我希望将它的“volleyResult”设置为 volley 请求生成的响应。
但是,当我第二次运行相同的代码时,它显示正确。
那么,如何在 'courses' 方法中保持 "Log.i(--)"直到 volleyResult 到达。
我有几种方法,就像“类(class)”一样,它们之间的唯一区别是它们调用的 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);
}
最佳答案
在 onResponse() 中调用 courses()
编辑澄清:
您在 Response.Listener 中填充 var volleyResult。这是异步的,所需时间取决于服务器延迟和您的互联网连接。有几种方法可以“保留”出需要 volleyResult 中的结果的处理方法。
最简单的方法: 在将响应存储在 volleyResult 中之后,在 onResponse 方法中移动进程(在您的例子中是 Log.i("Volley Res", 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);
}
万一你的 courses 方法被重复调用:你可以在接收到数据时设置一个标志,并将你的代码放在 if-condition block 中的 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);
}
}
关于java - 接收到 volley 响应后执行该方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35459235/