java - 如何从 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
包含响应或指示操作结果的枚举)。如果这是不可能的或不可取的,我该如何构建代码以保持关注点的分离?
我提前感谢任何可以引导我朝着正确方向前进的建议。
解决方案
推荐阅读
- ruby-on-rails - 部署到 Heroku 后出现 Rails 路由错误。虽然本地运行良好
- angular - Timepicker (ngx-bootstrap) 更改子午线 (PM/AM) 样式(颜色/背景)
- react-table - react-table 版本 7 onSortedChange 回调等效
- python - 两组点之间的插值
- google-sheets - 拆分数值并找到唯一的数字
- javascript - 通过时刻减去两个日期会导致错误的年份
- javascript - 使用 ReactJS 和 fetch-api 访问和显示 JSON 时遇到问题
- java - Java 组合框将值返回到另一个框架
- python - 如何通过按钮将烧瓶应用程序运行到 VS Code 中,而不是转到启动文件?
- python - Python Split() 索引错误