Java 同一个截击类多次用于API请求?

Java 同一个截击类多次用于API请求?,java,android,android-volley,Java,Android,Android Volley,我知道截击是伟大的网络图书馆。我的问题是我必须多次调用API请求,是否有机会在单独的类中调用此代码并每次使用它 String url = "sameurl"; JsonObjectRequest jsonObjReq = new JsonObjectRequest(Method.POST, url, null, new Response.Listener<JSONObject>() { @Override

我知道截击是伟大的网络图书馆。我的问题是我必须多次调用API请求,是否有机会在单独的类中调用此代码并每次使用它

String url = "sameurl";

JsonObjectRequest jsonObjReq = new JsonObjectRequest(Method.POST,
        url, null,
        new Response.Listener<JSONObject>() {

            @Override
            public void onResponse(JSONObject response) {
                Log.d(TAG, response.toString());

            }
        }, new Response.ErrorListener() {

            @Override
            public void onErrorResponse(VolleyError error) {
                VolleyLog.d(TAG, "Error: " + error.getMessage());
            }
        }) 
// Adding request to request queue
AppController.getInstance().addToRequestQueue(jsonObjReq);

您可以使用侦听器来执行此操作。在单独的类中移动所有与网络和截击相关的代码。将URL、http方法、标头等所需的对象和数据作为方法参数传递

您还需要有一个调用类将实现的接口,volley将调用此接口的方法,在收到响应或请求失败时通知调用方

您的界面将如下所示

public interface HttpListener {
   void onResponseReceived(JSONObject response);
   void onError(VolleyError error);
}
JsonObjectRequest jsonObjReq = new JsonObjectRequest(Method.POST,
        url, null,
        new Response.Listener<JSONObject>() {

            @Override
            public void onResponse(JSONObject response) {
                Log.d(TAG, response.toString());
                //pass httpListener instance as a method parameter to this method
                if(httpListener != null) {
                    httpListner.onResponseReceived(response);
                }

            }
        }, new Response.ErrorListener() {

            @Override
            public void onErrorResponse(VolleyError error) {
                VolleyLog.d(TAG, "Error: " + error.getMessage());
                if(httpListener != null) {
                    httpListner.onError(VolleyError error);
                }
            }
        }) 
现在在你的截击课上,你会有这样的动作

public interface HttpListener {
   void onResponseReceived(JSONObject response);
   void onError(VolleyError error);
}
JsonObjectRequest jsonObjReq = new JsonObjectRequest(Method.POST,
        url, null,
        new Response.Listener<JSONObject>() {

            @Override
            public void onResponse(JSONObject response) {
                Log.d(TAG, response.toString());
                //pass httpListener instance as a method parameter to this method
                if(httpListener != null) {
                    httpListner.onResponseReceived(response);
                }

            }
        }, new Response.ErrorListener() {

            @Override
            public void onErrorResponse(VolleyError error) {
                VolleyLog.d(TAG, "Error: " + error.getMessage());
                if(httpListener != null) {
                    httpListner.onError(VolleyError error);
                }
            }
        }) 
在进行http调用时,还需要传递此侦听器。最简单的方法是让调用方类实现此接口,并将其作为HttpListner的对象传递


调用方类将实现HttpListener接口并重写这些方法。无论何时通过此重写方法获得响应或任何错误,您都会收到回调。

实际上,我们的想法是在单独的线程中通过网络调用API。无论何时需要执行网络调用,都需要在单独的线程中执行,而Volley提供了一个有用的接口,可以方便地执行

因此,每当您在创建JSON请求时创建一个新的Volley实例时,它就会创建一个sperate线程并开始执行网络调用。主UI线程代码执行会继续进行,而不必等待网络调用完成——这是多线程的基本思想。GC根据需要处理所有垃圾收集


如果坚持使用同一个Volley对象来进行所有网络API调用,则需要以同步方式进行API调用。也就是说,当网络呼叫返回任何响应时,您需要启动下一个呼叫。此实现取决于您所处的情况。如果希望以异步方式执行网络调用,那么每次调用网络API时,必须利用多线程环境的异步行为创建Volley对象的新实例

同意@abuyousuf你的回答很好,而且很详细。您是否有此实现的示例,或者是否在任何地方使用过此过程?答案是实现。你需要遵循这些步骤。我没有任何现成的实现可以共享。我认为这个实现也会一直创建新的实例。在构造jsonObjReq时,每次进行新的网络调用时都需要传递url,从而创建一个新的JsonObjectRequest实例。这是事实,但我认为这里的问题不是关于线程问题。我认为这里的问题更倾向于如何以更可重用的方式实现http模块。诚然,我们可以创造尽可能多的截击,但这不是一个好的做法。理想情况下,您应该将所有这些抽象为一个单独的类,这样,如果您希望在将来更改库,就不必更改应用程序模块。如果每次我们想要发出网络请求时都创建一个新的volley实例,那么维护该代码将是一场噩梦。如果我错了,请纠正我。确实,我们可以创造尽可能多的截击,但这不是一个好的做法这取决于您的用例。如果您需要API调用是异步的,我建议您在每次调用网络API时创建新的Volley请求实例。否则,您需要同步调用API,这在某些情况下也是一种不好的做法。我建议异步网络调用。具有特定于截取的实现的类应该处理这个问题,无论是在每次调用中创建新对象还是重用同一对象。我不想把我的应用程序代码弄得乱七八糟。这在很大程度上取决于你如何管理你的代码和使用不同的框架。在我的案例中,我没有混乱的实现。