【问题标题】:android volley caching asynchronous requests - How te get url of the request in ResponseListenerandroid volley 缓存异步请求 - 如何在 ResponseListener 中获取请求的 url
【发布时间】:2014-01-29 14:23:30
【问题描述】:

我在应用程序中有很多在 volley 中完成的字符串请求。在每个模块中,都有一个不同的 onResponseListener 总是做不同的事情。而且我需要让它们也离线工作。所以我从缓存中得到响应。问题是可能会有很多使用不同 url 异步调用的请求。问题是从缓存中获取请求时如何记住请求的 url。目前它只在全局变量中,但由于请求可以异步发送,响应可能与全局变量 url 不匹配。有什么方法可以在 onResponse 中获取这个请求的原始请求 url 并直接在 Application.get().getApi().getCache(url) 中使用它?

请求看起来总是这样:

Application.get().getApi().getRequest(url, mListener);

mListener:

private class ResponseListenerX extends Api.ResponseListener {
        @Override
        public void onResponse(String response) {
            if (response != null) {


            }
        }

        @Override
        public void onErrorResponse(VolleyError error) {

            if ((error == null || error.networkResponse == null) && url != null) {

                // how to get here url from the request
                String response = Application.get().getApi().getCache(url);

                if (response != null && response.length() > 0) {
                    // onResponse


                }

            } 
        }
    }

【问题讨论】:

    标签: android caching asynchronous android-volley


    【解决方案1】:

    所以最好的解决方案是使用凌空扩展:eu.the4thfloor.volleyextended 有更新的响应侦听器,您可以在其中获得额外的布尔值更改,这意味着如果响应与缓存中的最后一个响应不同。

    在错误响应中还有额外的参数响应,您可以在服务器或网络中断的情况下使用。当然如果只是缓存的话。

    private class ResponseListenerYYY extends Api.ResponseListener {
        @Override
        public void onResponse(String response, boolean changed) {
    
        }
    
        @Override
        public void onErrorResponse(VolleyError error, String response) {
    
    
        }
    }
    

    【讨论】:

      【解决方案2】:

      您可以在 Listener 中创建一个私有变量,然后稍后引用它:

      Application.get().getApi().getRequest(url, new ResponseListenerX(url));
      
      private class ResponseListenerX extends Api.ResponseListener {
              private String requestedUrl;
      
              public ResponseListenerX(String requestedUrl) {
                  this.requestedUrl = requestedUrl;
              }
      
              @Override
              public void onResponse(String response) {
                  if (response != null) {
      
      
                  }
              }
      
              @Override
              public void onErrorResponse(VolleyError error) {
      
                  if ((error == null || error.networkResponse == null) && url != null) {
      
                      // how to get here url from the request
                      String response = Application.get().getApi().getCache(requestedUrl);
      
                      if (response != null && response.length() > 0) {
                          // onResponse
      
      
                      }
      
                  } 
              }
          }
      

      【讨论】:

        【解决方案3】:

        如果您为每个请求创建新的侦听器实例,那么您就是独一无二的:

        StringRequest request = new StringRequest(Request.Method.GET, url, null, 
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                  //...
                }
            }, new Response.ErrorListener() {
               @Override
               public void onErrorResponse(VolleyError error) {
                 //...
               }
            }
        );
        

        【讨论】:

          猜你喜欢
          • 2020-03-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-09-28
          • 1970-01-01
          • 1970-01-01
          • 2015-05-17
          • 2018-12-16
          相关资源
          最近更新 更多