2014-01-29 2 views
0

나는 발리에서 많은 문자열 요청을 처리했습니다. 각 모듈에는 항상 다른 일을하는 onResponseListener가 있습니다. 그리고 오프라인에서도 작업하게해야합니다. 그래서 캐시에서 응답을 얻고 있습니다. 문제는 다른 url과 비동기 적으로 호출되는 많은 요청이있을 수 있다는 것입니다. 문제는 캐시에서 가져올 때 요청의 URL을 기억하는 방법입니다. 현재는 전역 변수에만 있지만 요청이 비동기 적으로 전송 될 수 있으므로 응답이 전역 변수 url과 일치하지 않을 수 있습니다. 어떤 방법으로 요청에 원래 요청한 URL을 onResponse로 가져와 Application.get(). getApi(). getCache (url)에서 직접 사용하는 방법이 있습니까?android volley caching asynchronous requests - ResponseListener에서 요청 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 


       } 

      } 
     } 
    } 

답변

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) { 


    } 
} 
0

당신은 당신의 수신기 내부의 개인 변수를 만든 다음 나중에 참조 : 그래서

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 


       } 

      } 
     } 
    } 
0

당신은 독특한있어 요청 :

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) { 
     //... 
     } 
    } 
); 
관련 문제