Volley 학습 노트 | 원본 코드에서 Request, Response, Listener 범주에 대한 이해 (XMLRequest 사용자 정의 코드 첨부)

9973 단어

소결 Volley에서 Response가 수신에서 업무로 전환되는 과정

  • parseNetworkResponse()는 Response에 대한 첫 번째 해석입니다. 를 대응 Request의 Response로 조직하는 것입니다.
  • 그리고 이 Response는 , Response.success()
  • 에게 전달됩니다.
  • 이어서 Response.success(xmlPullParser, HttpHeaderParser.parseCacheHeaders(response));에서 이것deliverResponse()response, 즉 mListener.onResponse()
  • 에게 전할 것이다
  • 을 사용할 때 우리의 일반적인 조작은 실례화 하나mListener.onResponse(response);, 실례화 시(new과정)가 구조 방법에 전달된 것은 다시 쓴 것 Request, 즉 우리가 하나를 실례화할 때 다시 쓴 것onResponse(), 그 중에서 Listener 에 대한 Request, 즉첫 번째 해석으로 조직된 데이터/대상을 구체적인 업무 실현으로 제시한다.여기onResponse()onResponse()와 우리 자신의 실례화 구조의Response: , 사실은 프레임 원본 코드@Override public void onResponse( response)onResponse( response)Listener와 논리적으로 대응한다.
  • 말이 많지 않고 이 몇 가지 범용 간의 관계를 이해하면 Volley 프레임워크에서 사용자 정의 Request의 절차 과정과 원리를 이해할 수 있다.다음은 범용 간의 관계를 중심으로 필기를 전개하고 Volley에서 Response가 수신에서 업무로 전환하는 과정 설명과 관련된다.

  • 먼저 다음과 같이 StringRequest의 소스 코드를 살펴보십시오.
    /**
     * A canned request for retrieving the response body at a given URL as a String.
     */
    public class StringRequest extends Request {
        private final Listener mListener;
     
        /**
         * Creates a new request with the given method.
         *
         * @param method the request {@link Method} to use
         * @param url URL to fetch the string at
         * @param listener Listener to receive the String response
         * @param errorListener Error listener, or null to ignore errors
         */
        public StringRequest(int method, String url, Listener listener,
                ErrorListener errorListener) {
            super(method, url, errorListener);
            mListener = listener;
        }
     
        /**
         * Creates a new GET request.
         *
         * @param url URL to fetch the string at
         * @param listener Listener to receive the String response
         * @param errorListener Error listener, or null to ignore errors
         */
        public StringRequest(String url, Listener listener, ErrorListener errorListener) {
            this(Method.GET, url, listener, errorListener);
        }
     
        @Override
        protected void deliverResponse(String response) {
            mListener.onResponse(response);
        }
     
        @Override
        protected Response parseNetworkResponse(NetworkResponse response) {
            String parsed;
            try {
                parsed = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
            } catch (UnsupportedEncodingException e) {
                parsed = new String(response.data);
            }
            return Response.success(parsed, HttpHeaderParser.parseCacheHeaders(response));
        }
    }
    
  • 유형 Request 원본 코드의 parseNetwork Response()는 Response에 대한 첫 번째 해석입니다. new Response.Listener(){@Override...}를 대응deliverResponse()의 Response로 구성합니다. 예를 들어 다음과 같습니다.
  • mListener.onResponse(response);Listener、onResponse、response는 서버의 응답 데이터를 유형으로 구성했고, Request StringRequest: parseNetworkResponse()StringResponse.success(parsed, HttpHeaderParser.parseCacheHeaders(response));( Response parseNetworkResponse(NetworkResponse response),String parsed);ImageRequest
  • @Override
        protected Response parseNetworkResponse(NetworkResponse response) {
            String parsed;
            try {
                parsed = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
            } catch (UnsupportedEncodingException e) {
                parsed = new String(response.data);
            }
            return Response.success(parsed, HttpHeaderParser.parseCacheHeaders(response));
        }
    
  • 그리고 이 Response는 bitmap, Response.success(bitmap, HttpHeaderParser.parseCacheHeaders(response));
  • 에게 전달됩니다.
  • 이어서 deliverResponse()에서 이것(Response parseNetworkResponse(NetworkResponse response) )XMLRequest
  • 에게 전달합니다.
        @Override
        protected void deliverResponse(String response) {
            mListener.onResponse(response);
        }
    
  • 실례화 하나XmlPullParser를 할 때 우리는 구조 방법 하나Response parseNetworkResponse(NetworkResponse response)Response.success()를 다시 썼다. 즉, 우리가 하나Response.success(xmlPullParser, HttpHeaderParser.parseCacheHeaders(response));를 실례화할 때 다시 쓴 responsemListener.onResponse()에 대해 Request를 실시했다. 즉, 처음으로 분석한 조직된 데이터/대상을 구체적인 업무 실현으로 제시했다.

  • 다음은 XMLRequest의 사용자 정의 코드 및 사용 절차입니다.
  • 사용 절차:
  •         XMLRequest xmlRequest = new XMLRequest(
                    "http://flash.weather.com.cn/wmaps/xml/china.xml",
                    new Response.Listener() {
                        @Override
                        public void onResponse(XmlPullParser response) {
                            try {
                                int eventType = response.getEventType();
                                while (eventType != XmlPullParser.END_DOCUMENT) {
                                    switch (eventType) {
                                        case XmlPullParser.START_TAG:
                                            String nodeName = response.getName();
                                            if ("city".equals(nodeName)) {
                                                String pName = response.getAttributeValue(0);
                                                Log.d("TAG", "pName is " + pName);
    
                                                reponseContent += pName;
                                                reponseContent += "
    "; } break; } eventType = response.next(); } oriString = new String(reponseContent.getBytes("ISO-8859-1"), "utf-8"); responseText.setText(oriString); } catch (XmlPullParserException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Log.e("TAG", error.getMessage(), error); } }); mQueue.add(xmlRequest);
  • XMLRequest의 사용자 정의 코드:
  • public class XMLRequest extends Request {
     
        private final Listener mListener;
     
        public XMLRequest(int method, String url, Listener listener,
                ErrorListener errorListener) {
            super(method, url, errorListener);
            mListener = listener;
        }
     
        public XMLRequest(String url, Listener listener, ErrorListener errorListener) {
            this(Method.GET, url, listener, errorListener);
        }
     
        @Override
        protected Response parseNetworkResponse(NetworkResponse response) {
            try {
                String xmlString = new String(response.data,
                        HttpHeaderParser.parseCharset(response.headers));
                XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
                XmlPullParser xmlPullParser = factory.newPullParser();
                xmlPullParser.setInput(new StringReader(xmlString));
                return Response.success(xmlPullParser, HttpHeaderParser.parseCacheHeaders(response));
            } catch (UnsupportedEncodingException e) {
                return Response.error(new ParseError(e));
            } catch (XmlPullParserException e) {
                return Response.error(new ParseError(e));
            }
        }
     
        @Override
        protected void deliverResponse(XmlPullParser response) {
            mListener.onResponse(response);
        }
     
    }
    

    데모를 쓸 때 겪는 두 가지 버그와 해결 방법에 대한 글을 첨부합니다. 네트워크 보안 설정 문제:
  • Android 고버전 네트워크 실패 오류: Cleartext HTTP traffic to xxx not permitted 해결 방법
  • xml 해석 결과 디코딩 해결 방법: onResponse() 관련 글:
  • String의 인코딩 형식을 변경하는 방법
  • ISO-8859-1
  • 정보
  • 소결해 보면 Listener Request의 범형, onResponse()Response의 범형, new String(reponseContent.getBytes("ISO-8859-1"), "utf-8");의 범형은 모두 일치한다.
  • public class XMLRequest extends Request의 범용 사용자 정의 2단계 Request 유형을 지정합니다
  • .
  • Request의 범주형은parseNetworkResponse()가 첫 번째 해석을 한 반환 결과 유형을 나타내고 서버의 응답 데이터를 대응protected Response parseNetworkResponse(NetworkResponse response)의 유형으로 구성한다.
  • Response의 범주형은 private final Listener mListener;가 전달하는 Response의 유형에 대응하고 2차 해석 현금 인출 업무의 조작 대상(즉 Response, 첫 번째 해석의 반환 결과 유형)도 Listener의 매개 변수 유형
  • 을 나타낸다
  • 또한 Gson을 사용자 정의할 때 유형이 명확하지 않기 때문에 T로 위치를 차지하고 사용할 때 대응하는 클래스를 매개 변수로 사용하면 된다. 예시: RequestResponse RequestListener
  • 좋은 웹페이지 즐겨찾기