在我的库中处理回调

Handle callbacks in my library

我编写了一个 android 库,可以对各种网站进行网络调用和 returns 必要的内容。我正在使用 Volley 库,它具有 onResponseonFailure 等回调。最初这个库是一个app,后来改成了库

当它是一个应用程序时,我可以轻松处理回调。每当回调发生时,我都会从那里调用所需的函数,但现在当我导入为库并尝试使用它时,我会在调用它时立即使用库中的控件 returns 并且回调没有做任何事情。

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 是异步的,因此在您发送请求后任何其他即将到来的进程将照常继续,而无需等待响应。这就是为什么您的标志值看起来没有改变的原因,因为您可能在请求仍在等待响应时尝试访问它。这就是回调实现的原因:您一收到响应就采取某些操作,并且您不应该尝试处理将从另一个方法返回的值,因为它们会在更改之前返回。