首页 > 解决方案 > 如何从 volley 回调中获取 POJO,并在调用函数中使用/返回它?

问题描述

我正在使用用户帐户实现一个简单的移动应用程序。此外,它必须采用分层架构来构建,将表示、逻辑和对数据库的访问清晰地分开。我目前能够使用 volley 库从服务器发送和获取数据。但是,这些数据只能在对象的构造函数中作为参数传递的onResponse方法内部可用,稍后用于执行请求。我想使用我在响应中获得的数据来构建一个我可以在我的应用程序中使用的用户对象,并尽可能地保持分层架构。Response.Listener<String>stringRequest

这是我一直追求的那种方法的一个例子:

public ResponseType insertUser (final Context context, final String id, final String name, final String password) {

    //using a wrapper object because have to declare object as final to use
        //inside inner class, so use field to assign value
    final ResponseWrapper wrapper = new ResponseWrapper();

    StringRequest stringRequest = new StringRequest(Request.Method.POST, BuildConfig.ip,
            new Response.Listener<String>() {

                @Override
                public void onResponse(String response) {

                    wrapper.response = response.equals("") ?
                                        ResponseWrapper.SUCCESS :
                                        ResponseWrapper.DB_ERROR;
                }
            },
            new Response.ErrorListener() {

                @Override
                public void onErrorResponse(VolleyError error) {

                    wrapper.response = ResponseWrapper.CONNECTION_ERROR;
                }
        }){
            @Override
            protected Map<String, String> getParams() throws AuthFailureError {

                Map<String,String> params = new HashMap<String,String>();
                params.put("id",id);
                params.put("name",name);
                params.put("password",password);
                return params;
            }
        };

    RequestQueue requestQueue = Volley.newRequestQueue(context);
    requestQueue.add(stringRequest);

    //waiting for callback to modify field
    while(wrapper.response == null);

    return wrapper.response;
}

我尝试在内部设置外部对象onResponse的字段,等待更改字段以继续执行,但无济于事。代码编译并执行请求,但字段保持不变。我的研究表明,在处理异步代码时这是可以预料的。

我读过的大多数示例都将它们的范围限制为Toast在屏幕上显示响应。方法内部有几个更改活动,但这违背了我试图通过在数据库访问层内执行表示操作来实现的层分离(并且可能还执行业务逻辑,因为我的应用程序变得更加复杂)。

那么,如何从回调中获取对象呢?(例如,String包含响应或指示操作结果的枚举)。如果这是不可能的或不可取的,我该如何构建代码以保持关注点的分离?

我提前感谢任何可以引导我朝着正确方向前进的建议。

标签: javaandroidandroid-volley

解决方案


推荐阅读