首页 > 解决方案 > 如何将 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传递给这里写的。

编辑

我尝试了第二种方法,startRequestRequestHandler 现在看起来像这样:

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 更新的执行情况。

标签: androidcallbacksingletonandroid-volleyjsonobjectrequest

解决方案


推荐阅读