【问题标题】:How to Set Tag to the request and get it from Response Volley asynchronous request?如何为请求设置 Tag 并从 Response Volley 异步请求中获取?
【发布时间】:2016-03-21 09:59:18
【问题描述】:

我有一个带有多个 REST Api 的 Android 应用程序。 API 使用 Volley 库进行管理。反应越来越好,一切都很好。但是当我发出异步请求时,我无法识别每个请求的响应。

我的请求方法是这样的:

private void httpCall(String URL, String json, String session key, int type) {
        try {
            SSLContext sslcontext = SSLContext.getInstance("TLSv1");
           sslcontext.init(null,
                    null,
                    null);
            SSLSocketFactory NoSSLv3Factory = new NoSSLv3SocketFactory(sslcontext.getSocketFactory());
            HttpsURLConnection.setDefaultSSLSocketFactory(NoSSLv3Factory);

            Log.i(REQUEST_TAG, "httpCall=url" + url + "::type" + type);
            Log.i(REQUEST_TAG, "httpCall=json" + json);
        } catch (Exception e) {
            e.printStackTrace();

        }
        if (mContext != null)
            mQueue = CustomVolleyRequestQueue.getInstance(mContext).getRequestQueue();
        else
            mQueue = CustomVolleyRequestQueue.getInstance(mActivity).getRequestQueue();
        JSONObject mJSONObject;
        final CustomJSONObjectRequest jsonRequest;
        try {
            if ((json != null) && (json.trim().length() > 0)) {
                mJSONObject = new JSONObject(json);
            } else {
                mJSONObject = new JSONObject();
            }
            jsonRequest = new CustomJSONObjectRequest(sessionkey, type, url, mJSONObject, this, this);
            // Wait 20 seconds and don't retry more than once
            jsonRequest.setRetryPolicy(new DefaultRetryPolicy(
                    (int) TimeUnit.SECONDS.toMillis(20),
                    DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
                    DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));

            jsonRequest.setTag(REQUEST_TAG);
            mQueue.add(jsonRequest);
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

是否有任何选项可以为请求设置标签并从响应中获取相同的标签?这样我就可以识别当前的请求和响应。我不知道这是一个重复的问题,但我没有得到正确的解释。

我的回应方式是:

@Override
    public void onResponse(Object response) {
        if (response != null) {

            // I want to trigger the request tag from here

            mCallBack.onSuccessData(response);
        }
    }

请求和响应方法在同一个类中,该类实现了Response.Listener、Response.ErrorListener。

【问题讨论】:

  • 我不确定您要使用标签做什么,但是您在哪里实现 onResponse 方法?
  • 我修改了我的问题。请求和响应方法在同一个类中,我想在请求中设置一个标签/键并在响应上触发相同的。
  • 触发方式相同?? volley 中的标签用于引用请求对象。该请求已在响应方法上完成。你现在想用它做什么?
  • 请检查场景:我一次传递多个请求。请求是不同的 Api。那么我怎样才能分离每个请求和响应呢?或者有什么替代方法吗?我在我的应用程序中将其用作通用类。所以所有的请求都是从这里处理的。
  • 您一次只能将一个请求添加到请求队列中,因此您不会一次传递多个。您关心来自异步回调的数据。如果您需要一个请求的结果来执行另一个请求,那么您在第一个的 onResponse 中创建第二个请求

标签: android android-fragments android-intent android-volley android-internet


【解决方案1】:

您分配给 Request 的标签存储在变量 mTag 中,该变量在 Request 的整个生命周期中持续存在。

public Request<?> setTag(Object tag) {
    mTag = tag;
    return this;
}

对于我的应用程序,我稍微修改了以下 Volley 类:

Request 类中将 mTag 的可见性从私有更改为受保护

/** An opaque token tagging this request; used for bulk cancellation. */
    protected Object mTag;

Response类中,将Object标签添加到接口Listener中定义的回调函数onResponse

/** Callback interface for delivering parsed responses. */
public interface Listener<T> {
    /** Called when a response is received. */
    public void onResponse(Object tag, T response);
}

在实现接口 Response.Listener 的类中,例如 JsonRequest

@Override
protected void deliverResponse(T response) {
    mListener.onResponse(mTag, response);
}

【讨论】:

  • 按照onErrorResponse(ObjectmTag, VolleyError error)修改接口ErrorListener方法,错误响应也可以采用同样的流程
  • 你有同样的例子吗?
  • @Chebyr 如果您将其作为 gradle 依赖项而不是作为模块包括在内,该怎么办。是否也有解决方法
  • @Sagar Devanga 您可以创建扩展并实现自定义请求和响应类以添加标记。
  • @Chebyr 太棒了。我完全忘记了那条路线。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-22
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多