Android Volley – 如何在另一个类中隔离请求

嗨,我想模块化排球请求,所以我不会将活动演示代码与排球请求混在一起。 我看到的所有样本,凌空请求都被放置 – 例如 – 来自活动按钮的OnClick事件。

我的意思是这段代码(取自差异来源):

// prepare the Request JsonObjectRequest getRequest = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener() { @Override public void onResponse(JSONObject response) { // display response Log.d("Response", response.toString()); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Log.d("Error.Response", response); } } ); // add it to the RequestQueue queue.add(getRequest); 

我的观点是如何将所有请求代码传递给另一个类,然后实例化该类并调用makeRequest。 我已经尝试了这个,但它失败了。 我不知道它是否与Context相关但却失败了……

我这样做了:

 public void onClick(View v) { try{ Utils varRequest = new Utils(getApplicationContext()); String url = "https://ajax.googleapis.com/ajax/services/search/web?v=1.0&q="; varRequest.makeRequest(url); mitexto.setText(varRequest.miError); } catch(Exception excepcion) { System.out.println(excepcion.toString()); } } 

……和Utils类是:

 public class Utils { public Context contexto; public String miError; private RequestQueue queue ; public Utils (Context contextoInstancia){ contexto = contextoInstancia; queue = Volley.newRequestQueue(contexto); } public void makeRequest(String url){ JsonObjectRequest jsObjRequest = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener() { @Override public void onResponse(JSONObject response) { // TODO Auto-generated method stub miError="Response => "+response.toString(); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { // TODO Auto-generated method stub miError="Response => "+error.networkResponse.toString(); } }); queue.add(jsObjRequest); } } 

任何人都可以告诉我我做错了什么,或者如何构造代码?

提前致谢。

一般来说,分离这类东西是一种很好的做法,所以你在正确的道路上,考虑制作一个处理你的请求的singelton类 – 这是一个非常通用的模板 ,但应该让你的结构继续:

创建一个单例类,在应用程序出现时进行实例化:

 public class NetworkManager { private static final String TAG = "NetworkManager"; private static NetworkManager instance = null; private static final String prefixURL = "http://some/url/prefix/"; //for Volley API public RequestQueue requestQueue; private NetworkManager(Context context) { requestQueue = Volley.newRequestQueue(context.getApplicationContext()); //other stuf if you need } public static synchronized NetworkManager getInstance(Context context) { if (null == instance) instance = new NetworkManager(context); return instance; } //this is so you don't need to pass context each time public static synchronized NetworkManager getInstance() { if (null == instance) { throw new IllegalStateException(NetworkManager.class.getSimpleName() + " is not initialized, call getInstance(...) first"); } return instance; } public void somePostRequestReturningString(Object param1, final SomeCustomListener listener) { String url = prefixURL + "this/request/suffix"; Map jsonParams = new HashMap<>(); jsonParams.put("param1", param1); JsonObjectRequest request = new JsonObjectRequest(Request.Method.POST, url, new JSONObject(jsonParams), new Response.Listener() { @Override public void onResponse(JSONObject response) { Log.d(TAG + ": ", "somePostRequest Response : " + response.toString()); if(null != response.toString()) listener.getResult(response.toString()); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { if (null != error.networkResponse) { Log.d(TAG + ": ", "Error Response code: " + error.networkResponse.statusCode); listener.getResult(false); } } }); requestQueue.add(request); } } 

当你的申请出现时:

 public class MyApplication extends Application { //... @Override public void onCreate() { super.onCreate(); NetworkManager.getInstance(this); } //... } 

一个简单的回调接口(单独的文件会很好):

 public interface SomeCustomListener { public void getResult(T object); } 

最后,无论你想要什么,上下文已经在那里,只需调用:

 public class BlaBla { //..... public void someMethod() { NetworkManager.getInstance().somePostRequestReturningString(someObject, new SomeCustomListener() { @Override public void getResult(String result) { if (!result.isEmpty()) { //do what you need with the result... } } }); } } 

您可以将任何对象与侦听器一起使用,具体取决于您需要接收的内容,这也适用于GET请求并进行一些小修改(请参阅此SO线程以获取有关GET的更多信息 ),您可以从任何地方调用它(onClicks等。 ),只记得他们需要在方法之间进行匹配。

希望这有助于而且不会太晚!

我为此使用了一个简单的解决方案。 创建监听器 (因为它们是接口,它们不能直接实例化,但可以将它们实例化为实现接口的匿名类) 在活动或片段内 。 将这些实例作为parameter passing给Request。(StringRequest,JsonObjectRequest或ImageRequest)。

 public class MainActivity extends Activity { private static final String URI_WEATHER = "http://marsweather.ingenology.com/v1/latest/"; private Listener listenerResponse = new Listener() { @Override public void onResponse(JSONObject response) { Toast.makeText(MainActivity.this, "Resonse " + response.toString(), Toast.LENGTH_LONG).show(); } }; private ErrorListener listenerError = new ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Toast.makeText(MainActivity.this, "Error " + error, Toast.LENGTH_LONG).show(); } }; 

}

接下来,创建一个有请求的类,并将此侦听器传递给此类的请求方法,这就是全部。 我没有解释这部分,这与在任何教程中创建请求对象相同。但是您可以根据需要自定义此类。 您可以创建单个RequestQueue来检查优先级,或将body http体参数设置为此方法作为参数。

 public class NetworkManagerWeather { public static void getWeatherData(int method, Context context, String url, Listener listenerResponse, ErrorListener listenerError) { JsonObjectRequest requestWeather = new JsonObjectRequest(Method.GET, url, null, listenerResponse, listenerError); Volley.newRequestQueue(context).add(requestWeather); } 

}

最后从MainActivity调用此方法以实现instatnce

 NetworkManagerWeather.getWeatherData(Method.GET, this, URI_WEATHER, listenerResponse, listenerError);