我知道排球对网络图书馆很有帮助。我的问题是我必须多次调用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);
答案 0 :(得分:1)
您可以使用侦听器来执行此操作。将所有与网络和截击相关的代码移到一个单独的类中。将所需的对象和数据(例如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);
}
}
})
在进行http调用时,您还需要传递此侦听器。最简单的方法是使您的调用者类实现此接口,并将this
作为HttpListner的对象传递
您的调用者类将实现HttpListener接口并重写方法。每当您通过此覆盖的方法获得响应或任何错误时,都会得到回调。
答案 1 :(得分:0)
实际上,其想法是在单独的线程中通过网络调用API。每当您需要执行网络调用时,都需要在单独的线程中执行此操作,Volley提供了一个有用的接口以方便的方式执行此操作。
因此,无论何时在创建JSON请求时创建Volley的新实例,它都会创建一个独立的线程并开始执行网络调用。主要的UI线程代码执行进一步进行而无需等待网络调用完成-无论如何,这是多线程的基本思想。 GC会根据需要处理所有垃圾收集。
如果您坚持使用相同的Volley对象来进行所有网络API调用,则需要以同步方式进行API调用。也就是说,当网络呼叫返回任何响应时,您需要启动下一个呼叫。此实现取决于您在那里的情况。如果要以异步方式执行网络调用,则每次使用多线程环境的异步行为调用网络API时,都必须创建Volley对象的新实例。