我目前正在开发一个 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 更新的执行情况。