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

嗨,我想模块化凌空的请求,所以我不混合活动演示代码与凌空的请求。 我看到的所有示例都是通过活动button将这个抽象请求放置在OnClick事件上。

我的意思是这个代码(取自不同的来源):

// prepare the Request JsonObjectRequest getRequest = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() { @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。 我已经尝试过,但失败了。 我不知道这是否与上下文有关,但是失败

我做到了这一点:

 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<JSONObject>() { @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类来处理你的请求 – 这是一个非常通用的模板 ,但是应该让你的结构继续下去:

创build一个单例类,当你应用程序出现时,你将会安装它:

 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<String> listener) { String url = prefixURL + "this/request/suffix"; Map<String, Object> jsonParams = new HashMap<>(); jsonParams.put("param1", param1); JsonObjectRequest request = new JsonObjectRequest(Request.Method.POST, url, new JSONObject(jsonParams), new Response.Listener<JSONObject>() { @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); } //... } 

一个简单的监听器接口为您的callback(单独的文件将会很好):

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

最后,无论你想从哪里,上下文已经在那里,只要打电话:

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

你可以在监听器中使用任何对象,这取决于你需要接收什么,这也适用于GET请求,稍作修改( 更多关于GET请参阅这个线程 ),你可以从任何地方调用它(onClicks等)。 ),只记得他们需要匹配的方法。

希望这有助于而不是太晚!

我为此使用了一个简单的解决scheme。 在活动或片段内部 创build监听器 (因为它们是接口,它们不能被直接实例化,但可以实例化为实现接口的匿名类)。 将这些实例作为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<JSONObject> listenerResponse = new Listener<JSONObject>() { @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(); } }; 

}

接下来,创build一个具有请求的类,并将此侦听器传递给此类的请求方法,就这些了。 我没有解释这部分,这与在任何教程中创build一个请求对象是一样的。但是你可以自定义这个类。 您可以创build单身RequestQueue来检查优先级,或者将身体http身体参数设置为此方法的参数。

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

}

最后从MainActivity调用这个方法

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