我编写了一个 android 库,可以对各种网站进行网络调用并返回必要的内容。我正在使用 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);
}
}
当此代码是应用程序的一部分而不是返回标志值时,我会调用适当的函数来处理结果。现在,每当我调用这些函数时,都会在回调完成之前返回 flag 的值,这会导致一些问题。
我的问题是我如何在回调周围扭曲它,以便在网络调用完成时通知使用此库的应用程序?
您可以为库添加自己的回调
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;
}
});
Volley 是异步的,因此在您发送请求后的任何其他即将进行的进程都将照常进行,而无需等待响应。这就是为什么您的标志值看起来没有更改的原因,因为您可能会在请求仍在等待响应时尝试访问它。这就是回调实现的原因:您在收到响应后立即执行某些操作,并且不应尝试处理将从其他方法返回的值,因为它们将在更改之前返回。