java - 如何为跨类 Volley 方法调用创建合适的 Volley Listener

标签 java android callback listener android-volley

我的目标是从另一个类调用 Volley,这是一种非常简洁、模块化的方式,即:

            VolleyListener newListener = new VolleyListener();
            VolleySingleton.getsInstance().somePostRequestReturningString(getApplicationContext(), newListener);
            JSONObject data = newListener.getResponse();

但是我在让监听器部分工作以便能够从诸如

的方法访问结果数据方面遇到了很多麻烦
newListener.getResponse();

本网站上有几个问题大致概述了如何设置来自另一个类(class)的截击,例如:Android Volley - How to isolate requests in another class .我已经成功地使方法调用起作用,但是现在将该数据放入当前类中以供使用造成了麻烦。

我的 VolleySingleton 类中的操作为:

public void somePostRequestReturningString(final Context context,final VolleyListener<String> listener) {

        final String URL = "http://httpbin.org/ip";

        JsonObjectRequest set = new JsonObjectRequest(Request.Method.GET, URL, ((String) null),
                new Response.Listener<JSONObject>() {
                    @Override
                    public void onResponse(JSONObject response) {

                        listener.outPut = response.toString();
                        //Toast.makeText(context, response.toString(), Toast.LENGTH_LONG).show();
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        Log.d("Error.Response", error.toString());
                    }
                }
        );

        mRequestQueue.add(set);
}

在监听类中:

public class VolleyListener {
    public static String outPut;

    private static Response.Listener<String> createSuccessListener() {
        return new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                outPut = response;
            }
        };
    }
}

我如何配置它才能工作并允许来自另一个类的 Volley 调用和数据检索,特别是如何正确构建回调?

最佳答案

根据您的要求,我建议您引用我的以下解决方案,希望它清楚并有所帮助:

首先是界面:

public interface VolleyResponseListener {
    void onError(String message);

    void onResponse(Object response);
}

然后在你的助手类中(我将其命名为 VolleyUtils 类):

public static void makeJsonObjectRequest(Context context, String url, final VolleyResponseListener listener) {
        JsonObjectRequest jsonObjectRequest = new JsonObjectRequest
                (url, null, new Response.Listener<JSONObject>() {

                @Override
                public void onResponse(JSONObject response) {
                    listener.onResponse(response);
                }
            }, new Response.ErrorListener() {

                @Override
                public void onErrorResponse(VolleyError error) {
                    listener.onError(error.toString());
                }
            }) {

        @Override
        protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {
            try {
                String jsonString = new String(response.data,
                        HttpHeaderParser.parseCharset(response.headers, PROTOCOL_CHARSET));
                return Response.success(new JSONObject(jsonString),
                        HttpHeaderParser.parseCacheHeaders(response));
            } catch (UnsupportedEncodingException e) {
                return Response.error(new ParseError(e));
            } catch (JSONException je) {
                return Response.error(new ParseError(je));
            }
        }
    };

    // Access the RequestQueue through singleton class.
    VolleySingleton.getInstance(context).addToRequestQueue(jsonObjectRequest);
}

然后,在您的 Activity 类中,您可以像下面这样调用:

VolleyUtils.makeJsonObjectRequest(mContext, url, new VolleyResponseListener() {
        @Override
        public void onError(String message) {

        }

        @Override
        public void onResponse(Object response) {

        }
    });

您可以引用以下问题了解更多信息(正如我昨天告诉您的):

Android: How to return async JSONObject from method using Volley?

POST Request Json file passing String and wait for the response Volley

Android/Java: how to delay return in a method

关于java - 如何为跨类 Volley 方法调用创建合适的 Volley Listener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33535435/

相关文章:

java - 奇怪的 Spring MVC 上下文配置行为

java - 使用 Spring MVC 的 tomcat 中的 PATCH 方法

java - 如何使用 Feign 框架添加 JSON 形式的 URL 参数?

javascript - 从回调函数中获取变量

javascript - 回调完成后运行

java - 文件中的 JUnit 测试

OnClickListener.onClick中出现NullPointerException时Android卡死(其他任务无法启动)

android - 无法从 CursorWindow 读取第 1 行,col -1。在从游标访问数据之前确保正确初始化了游标

android - android 中使用 Zxing 库生成二维码版本 2 和二维码版本 4 的区别

jquery - YouTube iframe api - 为什么 onError 事件被调用两次?