我编写了一个安卓库,可以对各种网站进行网络调用并返回必要的内容。我正在使用Volley库,其中包含onResponse
和onFailure
等回调。最初这个库是一个应用程序,后来改为库。
当它是一个应用程序时,我可以轻松处理回调。每当回调发生时,我从那里调用所需的函数,但现在当我作为库导入并尝试使用它时,控件一旦调用它就会从库中返回并且回调没有做任何事情。
public void sendForVerification(final String Response, final String Secret, final String Name) {
StringRequest stringRequest = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
flag = true;
},
new Response.ErrorListener() {
@Override
public void onErrorResponse (VolleyError error){
flag = false;
}
}}) {
@Override
protected Map<String, String> getParams () throws AuthFailureError {
HashMap<String, String> params = new HashMap<>();
params.put("secret", Secret);
params.put("response", Response);
return params;
}
};
requestQueue.add(stringRequest);
}
}
当这段代码是app的一部分而不是返回标志值时,我会调用一个合适的函数来处理结果。现在,只要我调用这些函数,就会在回调完成之前返回flag的值,这会导致一些问题。
我的问题是如何围绕回调对此进行扭曲,以便在网络调用完成后通知使用此库的应用程序?
答案 0 :(得分:3)
您可以为您的库添加自己的回调
interface YourCallback<T> {
onResponse(T value);
}
public void sendForVerification(final String Response,final String Secret,final String Name, YourCallback<Boolean> callback){
StringRequest stringRequest = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
callback.onResponse(true);
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
callback.onResponse(false);
}
}){
@Override
protected Map<String, String> getParams() throws AuthFailureError {
HashMap<String,String> params = new HashMap<>();
params.put("secret",Secret);
params.put("response",Response);
return params;
}
};
requestQueue.add(stringRequest);
}
boolean flag;
api.sendForVerification("", "", "", new YourCallback<Boolean>() {
@Override
public void onResponse(Boolean value) {
flag = value;
}
});
答案 1 :(得分:0)
Volley是异步的,因此您发送请求后的任何其他即将进行的过程将继续正常进行而无需等待响应。这就是为什么你的标志值似乎没有改变的原因,因为你可能在请求仍在等待响应时尝试访问它。这就是回调实现的原因:你在得到响应时立即采取某些行动,你不应该尝试处理从另一个方法返回的值,因为它们会在变化之前返回。