在我的库中处理回调
我写了一个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);
}
}
当这个代码是应用程序的一部分,而不是返回的标志值我会调用适当的函数来处理结果。现在每当我调用这些函数时,在回调完成之前返回标志的值,这会导致一些问题。
我的问题是我怎样才能围绕回调扭曲这种情况,以便在网络调用完成时通知使用此库的应用程序?
你可以添加自己的回调(S)为您的图书馆
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;
}
});
排球是asynchronus,所以任何其他即将到来的过程中,你将会发送请求后没有等待回应就照常继续。这就是为什么你的标志值看起来没有改变,因为你可能试图访问它,而请求仍在等待响应。这就是回调实现的原因:一旦你得到响应,你就会采取某些行动,并且你不应该试图处理从另一个方法返回的值,因为它们会在它们改变之前被返回。
是啊。我在@ cricket_007的回答后第一次没有弄清楚,我能够实现自己的回调并使其工作。 – Tyson
我认为这将适用于'Volley'库,但我也有其他Google API执行调用。我该怎么做?是否有任何广义回调,我可以在我的库中创建,并在需要时从应用程序调用它们。 – Tyson
是的,刚刚更新了答案,而不是 –
我会尝试.. – Tyson