2017-06-24 7 views
0

android vollyを使用してjsonデータを取得するにはapiを呼び出す必要があります。私は、私はこの方法にVolly:DRY原理に従ったメソッドの実装

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

をaccesing午前クラスBの内側

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]; 
} 
} 

を示すようにget要求を呼び出すために、クラスAの内部に実装する方法を持ってここに私はJSONデータを取得するために、コンテキストとURLを渡すことができます。しかし、問題はgetList()メソッドのrutursがサーバーからの応答を受け取る前であっても結果です。アプリはget要求を呼び出す必要がある複数のクラスを持っています。このコードスニペットをそのようなすべてのクラスの内部で使用すると、DRYの原則に反します。このシナリオでは、従うべき正しいプロコーディングは何ですか?

答えて

0

下記のようにinterfaceを使用してください。

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. 
    } 
} 
関連する問題