2017-06-24 1 views
0

J'ai besoin d'appeler une API pour obtenir une donnée json en utilisant Android volly. J'ai un procédé mis en oeuvre à l'intérieur de la classe A pour appeler la requête get comme indiquéVolly: Implémentation des méthodes en suivant le principe DRY

class A{ 
public static String getList(Context context,String url) 
{ 
    final String[] result = new String[1]; 

    JsonArrayRequest req = new JsonArrayRequest(url, 
      new Response.Listener<JSONArray>() { 
       @Override 
       public void onResponse(JSONArray response) { 
        Log.e("response",response.toString()); 
        result[0] =response.toString(); 
       } 
      }, new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError error) { 
      Log.e("responseerror",error.toString()); 
      result[0] =error.toString(); 
     } 
    }); 

    MySingleton.getInstance(context).addToRequestQueue(req); 


    return result[0]; 
} 
} 

intérieur classe B je suis accesing cette méthode

class B { 
String responce= A.getList(activity,url); 
} 

Ici, je peux passer le contexte et l'URL pour obtenir des données JSON. Mais le problème est que la méthode getList() ruturs aboutit avant même d'avoir une réponse du serveur. L'application a plus d'une classe qui doit appeler obtenir une demande. Si je vais utiliser cet extrait de code à l'intérieur de chaque classe, alors ce sera contre le principe DRY. Alors, quelle est la procudure appropriée à suivre dans ce scénario?

Répondre

0

Utilisez un interface comme ci-dessous.

class A { 
    private final WeakReference<ResponseListener> responseListenerWeakRef; 

    public A(ResponseListener responseListener) { 
    responseListenerWeakRef = new WeakReference<ResponseListener>(responseListener); 
    } 

    public String getList(Context context, String url) { 
    JsonArrayRequest req = new JsonArrayRequest(url, 
     new Response.Listener<JSONArray>() { 
     @Override 
     public void onResponse(JSONArray response) { 
      Log.e("response",response.toString()); 
      if (responseListener!=null && responseListener.get()!=null) { 
      responseListener.get().onResponse(response.toString()); 
      } 
     } 
     }, new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError error) { 
      Log.e("responseerror",error.toString()); 
      if (responseListener!=null && responseListener.get()!=null) { 
      responseListener.get().onResponse(error.toString()); 
      } 
     } 
     } 
    ); 
    MySingleton.getInstance(context).addToRequestQueue(req); 
    } 

    public interface ResponseListener { 
    void onResponse(String response); 
    } 
} 

class B implements A.ResponseListener { 
    private void makeApiCall() { 
    new A(this).getList(activity, url); 
    } 

    @Override 
    public void onResponse(String response) { 
    // Do something with the response. 
    } 
}