Volly:遵循DRY原则实施方法

时间:2017-06-24 10:38:15

标签: android android-volley dry

我需要使用android volly调用api来获取json数据。我有一个在A类中实现的方法来调用get请求,如图所示

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

在课程B中我正在访问此方法

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

在这里,我可以传递上下文和url来获取json数据。但问题是getList()方法ruturs结果甚至在它从服务器获得任何响应之前。该应用程序有多个类需要调用get请求。如果我将在每个这样的类中使用此代码片段,那么它将违反DRY原则。那么在这种情况下应遵循的适当原则是什么?

1 个答案:

答案 0 :(得分: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.
  }
}