2017-07-27 107 views
1

我寫了一個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); 
    } 
} 

當這個代碼是應用程序的一部分,而不是返回的標誌值我會調用適當的函數來處理結果。現在每當我調用這些函數時,在回調完成之前返回標誌的值,這會導致一些問題。

我的問題是我怎樣才能圍繞回調扭曲這種情況,以便在網絡調用完成時通知使用此庫的應用程序?

回答

3

你可以添加自己的回調(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

0

排球是asynchronus,所以任何其他即將到來的過程中,你將會發送請求後沒有等待迴應就照常繼續。這就是爲什麼你的標誌值看起來沒有改變,因爲你可能試圖訪問它,而請求仍在等待響應。這就是回調實現的原因:一旦你得到響應,你就會採取某些行動,並且你不應該試圖處理從另一個方法返回的值,因爲它們會在它們改變之前被返回。

+0

是啊。我在@ cricket_007的回答後第一次沒有弄清楚,我能夠實現自己的回調並使其工作。 – Tyson