当我运行以下代码时, 我得到了#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);
}
答案 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。