【问题标题】:Volley Request (Request Code missing)排球请求(缺少请求代码)
【发布时间】:2015-06-12 12:21:42
【问题描述】:

我正在比较 Volley Libs(我拥有的旧版本和最新的 here

下面是用于实例化请求的内容(Request.java 类)

//旧代码

public Request(int method, String url, Response.ErrorListener listener,int requestCode) {
    mMethod = method;
    mUrl = url;
    mErrorListener = listener;
    mRequestCode = requestCode;
    setRetryPolicy(new DefaultRetryPolicy());

    mDefaultTrafficStatsTag = TextUtils.isEmpty(url) ? 0: Uri.parse(url).getHost().hashCode();
}

//当前代码

public Request(int method, String url, Response.ErrorListener listener) {
    mMethod = method;
    mUrl = url;
    mIdentifier = createIdentifier(method, url);
    mErrorListener = listener;
    setRetryPolicy(new DefaultRetryPolicy());

    mDefaultTrafficStatsTag = findDefaultTrafficStatsTag(url);
}

令我惊讶的是我一直在使用非常突出的东西。 requestCode 变量在新变量中缺失,我使用它来识别我的响应或错误属于哪个请求。

引入了一个新变量 mIdentifier,我认为它可能是替代品,但找不到任何相关信息。

另外,我发现在 Request 对象上使用了 setTag() 方法,但这只是为了取消请求,here

任何关于我如何实现相同的 requestCode 事物或解决方法以在新代码中获得相同功能的建议或帮助都会很棒。

谢谢。 :)

示例:以下是响应和错误回调的处理方式。旧代码中缺少 type 参数。

//旧代码

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

    /**
     * On response headers.
     *
     * @param headers the headers
     */
    public void onResponseHeaders(Map<String, String> headers,int type);
}

/** Callback interface for delivering error responses. */
public interface ErrorListener {
    /**
     * Callback method that an error has been occurred with the
     * provided error code and optional user-readable message.
     */
    public void onErrorResponse(VolleyError error,int type);
}

//当前代码

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

/** Callback interface for delivering error responses. */
public interface ErrorListener {
    /**
     * Callback method that an error has been occurred with the
     * provided error code and optional user-readable message.
     */
    public void onErrorResponse(VolleyError error);
}

编辑(我希望在新代码中实现以下内容,而不是每次创建请求时都编写响应):

@Override
public void onResponse(Object response, int type) {     

    if (type == NetworkController.REQ_CODE_UPDATE_USER) {
        //Update user
    }else if(type == NetworkController.REQ_CODE_DELETE_USER){
        //Delete User
    }
}

【问题讨论】:

  • 为什么需要requestCode来识别请求?
  • 假设我在同一个屏幕上有两个请求,那么我将 request = new Request 以及整个响应和错误代码写在同一个地方。这我必须重复第二个请求。但是,使用 requestCode 我可以做的只是在调用请求时将上下文传递给响应参数,然后在实现响应侦听器后我将覆盖的 onResponse 方法中,如果 requestCode == 1st request 执行此操作,我可以执行此操作。希望你能在这里得到照片。
  • 对我来说,您似乎想避免创建不同的侦听器实例
  • 是的,你明白我的意思。
  • 这样你就可以紧密耦合两个不相关的东西。好处 0. 每个不同的后端调用都有一个不同的 Listener

标签: android android-volley


【解决方案1】:

如果我理解正确,您希望为您创建的所有请求维护一个响应侦听器。然后你可以像下面这样实现一个自定义监听器并存储每个请求的 reqcode 并根据 reqcode 处理响应。

class MyResponseListener implements Response.Listener<String> {
            int reqCode;
            public MyResponseListener(int reqcode){
                reqCode = reqcode;
            }
            @Override
            public void onResponse(String response) {
                if(reqCode  == 1){
                    Log.v("myapp","inside req code 1");
                    tv1.setText("hello world");
                }else if(reqCode == 2){
                    Log.v("myapp","inside req code 2");
                    tv2.setText("hello world2");
                }
            }
        }

如下创建请求。

StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
                    new MyResponseListener(1), new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    //mTextView.setText("That didn't work!");
                }
            });

            StringRequest stringRequest2 = new StringRequest(Request.Method.GET, url,
                    new MyResponseListener(2), new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    //mTextView.setText("That didn't work!");
                }
            });

我希望这是你需要的。

【讨论】:

  • 谢谢@7383。但是在这种情况下,我将不得不在任何我想使用它的地方创建这个内部类,不是吗? :(
  • 当然可以。这比最终创建多个匿名类来处理响应的旧方法要好。但在这种情况下,您只有一个类可以处理不同的响应。
  • 您还在寻找更多东西吗?以上答案不能解决您的问题?
  • volley 库本身非常稳定。我只是想在它上面构建一个包装器,以便我可以简单地调用。我想我将不得不重写 Request 类。
  • 好的,如果您觉得有帮助,请为答案投票,因为您知道投票对于提高声誉很重要:-)
猜你喜欢
  • 2020-10-12
  • 2019-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-02
相关资源
最近更新 更多