android - 如何将 JsonObjectRequests 从抽象 android 类正确委托给处理程序
问题描述
我目前正在开发一个 android 项目,在该项目中我使用 Volley 来处理一些 JsonObjectRequests。
请求组件都存储在一个抽象片段类中,因此从它继承的所有片段都能够向我的 API 发送请求并以可定制的方式处理响应。
总班:
public abstract class RequestingFragment extends Fragment implements RequestCallbacks {
public RequestQueue requestQueue;
public final void startRequest(final RequestOperation operation) {
String url = getContext() != null ? getContext().getResources().getString(R.string.base_url) : "";
final JsonObjectRequest request = new JsonObjectRequest(Request.Method.POST, baseUrl + operation.url(requestParams), null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
onSuccess(response, operation.parsingKey());
onFinished(operation.parsingKey());
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
onError(operation.parsingKey());
onFinished(operation.parsingKey());
error.printStackTrace();
}
});
requestQueue.add(request);
}
//these are intended to be defined in the subclasses
public void onSuccess(JSONObject json, String parsingKey) {
}
public void onError(String parsingKey) {
}
public void onFinished(String parsingKey) {
}
}
现在在进一步开发过程中,我面临的问题不仅是片段必须能够发送请求,而且组件也必须能够发送请求,例如 RecyclerView.Adapter 或 BroadcastReceiver。所以我计划按照这个描述将请求功能迁移到一个处理程序单例。
如上面的代码片段所示,这些回调从请求响应中获取参数,所以我想知道它是否是一种更好的方法,只返回请求的结果(可以是不同的对象,如 JSONObject 或 VollerError ),或者将回调startRequest()
作为 Runnable传递给这里写的。
编辑
我尝试了第二种方法,startRequest
RequestHandler 现在看起来像这样:
public void startRequest(RequestOperation operation, final Runnable onSuccess, final Runnable onError, final Runnable onFinished) {
JsonObjectRequest request = new JsonObjectRequest(Request.Method.POST, instance_context.getResources().getString(R.string.base_url), null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
onSuccess.run();
onFinished.run();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
onError.run();
onFinished.run();
}
});
queue.add(request);
}
现在我的问题是:我已经读到Runnable
默认情况下在自己的线程上执行。在Volley 文档中,它说 RequestQueue 的响应被传递到主线程。现在我的一些响应用于更新我的 UI,所以如果我在回调中这样做,那不是异步的吗?我必须在回调结束时重新加载我的 UI 吗?
编辑 2
我正在尝试继承 Runnable,以便可以将参数传递给该run()
方法。然后我将尝试测试 UI 更新的执行情况。
解决方案
推荐阅读
- python - 以 JSON 代替 pandas 数据帧的一对多连接 pandas 数据帧
- bpmn.io - 在 propertiesPanel 中添加 bpmn:Resource
- elasticsearch - elasticsearch 短语前缀搜索
- javascript - 是否使用了 javascript mvc 模式?
- python - gurobipy中的倒置指标约束
- python - 将装饰器添加到继承类的方法中?
- xamarin - 如何使用 burp 拦截 xamarin 移动应用程序流量?
- javascript - 如何在Javascript中删除对象中的数组?
- python - 在从 csv 文件中抓取 python url 中的输入/打印时保持一致性
- mysql - 如何编译 mysql-server 示例插件