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

mar*_*olp 20 android android-volley

嗨,我想模块化排球请求,所以我不会将活动演示代码与排球请求混在一起.我看到的所有样本,凌空请求都被放置 - 例如 - 来自活动按钮的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);
Run Code Online (Sandbox Code Playgroud)

我的观点是如何将所有请求代码发送到另一个类,然后实例化该类并调用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());

        }

    }
Run Code Online (Sandbox Code Playgroud)

......和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);
    }
}   
Run Code Online (Sandbox Code Playgroud)

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

提前致谢.

Tom*_*ySM 55

一般来说,分离这类东西是一种很好的做法,所以你在正确的道路上,考虑制作一个处理你的请求的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<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);
    }
}
Run Code Online (Sandbox Code Playgroud)

当你的申请出现时:

public class MyApplication extends Application
{
  //...

    @Override
    public void onCreate()
    {
        super.onCreate();
        NetworkManager.getInstance(this);
    }

 //...

}
Run Code Online (Sandbox Code Playgroud)

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

public interface SomeCustomListener<T>
{
    public void getResult(T object);
}
Run Code Online (Sandbox Code Playgroud)

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

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...
                    }
                }
            });
        }
}
Run Code Online (Sandbox Code Playgroud)

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

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