在我的库中处理回调

问题描述:

我写了一个android库,可以对各种网站进行网络调用并返回必要的内容。我正在使用Volley库,它的回调类似onResponseonFailure。最初这个库是一个应用程序,后来被改为一个库。在我的库中处理回调

当它是一个应用程序,我可以很容易地处理回调。无论何时发生回调,我都会从那里调用所需的函数,但现在当我导入为库并尝试使用它时,只要我调用该函数,控件将从库中返回,并且回调函数没有执行任何操作。

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; 
    } 
}); 
+0

我认为这将适用于'Volley'库,但我也有其他Google API执行调用。我该怎么做?是否有任何广义回调,我可以在我的库中创建,并在需要时从应用程序调用它们。 – Tyson

+0

是的,刚刚更新了答案,而不是 –

+0

我会尝试.. – Tyson

排球是asynchronus,所以任何其他即将到来的过程中,你将会发送请求后没有等待回应就照常继续。这就是为什么你的标志值看起来没有改变,因为你可能试图访问它,而请求仍在等待响应。这就是回调实现的原因:一旦你得到响应,你就会采取某些行动,并且你不应该试图处理从另一个方法返回的值,因为它们会在它们改变之前被返回。

+0

是啊。我在@ cricket_007的回答后第一次没有弄清楚,我能够实现自己的回调并使其工作。 – Tyson