Android/Java : 有没有办法在侦听器触发后调用方法的 return ?
Android/Java : Is there a way to call the return of the method after a listener triggered?
我正在使用 Volley 从 HTTP Api 获取 JSONObject。
我的问题是我希望我的方法等待 Response Listener 获得结果,否则我的方法将返回空对象。
我尝试使用同步等待和通知来实现它,但它似乎不起作用,activity 在 isFinished.wait()[=20= 之后冻结] 并且侦听器不会触发。你能告诉我我的代码有什么问题吗?
public JSONObject query(String url) throws InterruptedException {
finished=false;
Req = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
synchronized (isFinished){
Retour = response;
finished = true;
isFinished.notifyAll();
}
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
synchronized (isFinished){
Retour = null;
finished = true;
isFinished.notifyAll();
}
}
});
Queue.add(Req);
synchronized (isFinished) {
while (!finished) {
isFinished.wait();
}
return Retour;
}
}
我通过更改设计解决了它,所以该方法没有 return 任何东西,而是回调 Consumer 接口,然后将结果检索到 class 字段 数据 :
Consumer<JSONObject> cons = a -> Data=a;
原代码变为:
public void query(String url,Consumer<JSONObject> cons) {
Req = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
Retour = response;
callb.accept(Retour);
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Retour = null;
callb.accept(null);
}
});
Queue.add(Req);
}
我正在使用 Volley 从 HTTP Api 获取 JSONObject。
我的问题是我希望我的方法等待 Response Listener 获得结果,否则我的方法将返回空对象。
我尝试使用同步等待和通知来实现它,但它似乎不起作用,activity 在 isFinished.wait()[=20= 之后冻结] 并且侦听器不会触发。你能告诉我我的代码有什么问题吗?
public JSONObject query(String url) throws InterruptedException {
finished=false;
Req = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
synchronized (isFinished){
Retour = response;
finished = true;
isFinished.notifyAll();
}
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
synchronized (isFinished){
Retour = null;
finished = true;
isFinished.notifyAll();
}
}
});
Queue.add(Req);
synchronized (isFinished) {
while (!finished) {
isFinished.wait();
}
return Retour;
}
}
我通过更改设计解决了它,所以该方法没有 return 任何东西,而是回调 Consumer 接口,然后将结果检索到 class 字段 数据 :
Consumer<JSONObject> cons = a -> Data=a;
原代码变为:
public void query(String url,Consumer<JSONObject> cons) {
Req = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
Retour = response;
callb.accept(Retour);
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Retour = null;
callb.accept(null);
}
});
Queue.add(Req);
}