Android Volley - 如何隔离另一个类中的请求 [英] Android Volley - How to isolate requests in another class
问题描述
我想模块化齐射请求,所以我不会将活动呈现代码与齐射请求混合在一起.我看到的所有示例都将齐射请求放在 - 例如 - 来自活动按钮的 OnClick 事件.
Hi I'd like to modularize the volley requests so I don't mix activity presentation code with volley requests. All samples I saw, the volley request are being placed -for example- on the OnClick event from an activity button.
我的意思是这个代码(取自差异源):
I mean this code(taken from diff source):
// 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.我已经尝试过这个,但它失败了.我不知道它是否与上下文有关,但它失败了...
My point here is how to get this all request code to another class and just instance the class and call the makeRequest. I already tried this but it fails. I don't know if it's something related with the Context but it fails...
我是这样做的:
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 类是:
... and the Utils class is:
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);
}
}
谁能告诉我我做错了什么,或者如何构建代码?
Can anyone tell me what I'm doing wrong, or how to structure the code?
提前致谢.
推荐答案
一般来说,将这类东西分开是一种很好的做法,所以你走在正确的道路上,考虑制作一个处理你的请求的单一类 - 这是一个非常通用的模板,但应该能让你的结构正常运行:
in general it's good practice to seperate this sort of stuff, so you're on the right path, consider making a singelton class that handles your requests - this is a very general template, but should get your structure going:
创建一个单例类,当你的应用程序出现时你会创建它:
create a singleton class, which you instatiate when you're application comes up:
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);
}
}
当您的应用程序出现时:
when your application comes up:
public class MyApplication extends Application
{
//...
@Override
public void onCreate()
{
super.onCreate();
NetworkManager.getInstance(this);
}
//...
}
用于回调的简单侦听器接口(单独的文件会很好):
a simple listener interface for your callback (seperate file would do good):
public interface SomeCustomListener<T>
{
public void getResult(T object);
}
最后,从你想要的任何地方,上下文已经在那里,只需调用:
and finally, from wherever you want, the context is already in there, just call:
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 请求,(请参阅 此 SO 线程了解有关 GET 的更多信息),您可以从任何地方(onClicks 等)调用它,只需记住它们需要在方法之间进行匹配.
you can use any object with the listener, depending on what you need to receive, this also works for GET requests with some minor modification, (see this SO thread for more about GET) and you can call that from everywhere (onClicks, etc.), just remember they need to match between methods.
希望这会有所帮助,不要太晚!
Hope this Helps and not too late!
这篇关于Android Volley - 如何隔离另一个类中的请求的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!