Volley 학습 노트 | 원본 코드에서 Request, Response, Listener 범주에 대한 이해 (XMLRequest 사용자 정의 코드 첨부)
소결 Volley에서 Response가 수신에서 업무로 전환되는 과정
parseNetworkResponse()는 Response에 대한 첫 번째 해석입니다.  를 대응 Request의 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와 논리적으로 대응한다.먼저 다음과 같이 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));
    }
}
       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));
    }
   bitmap, Response.success(bitmap, HttpHeaderParser.parseCacheHeaders(response));(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));를 실례화할 때 다시 쓴 response 중mListener.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);
   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);
    }
 
}
       데모를 쓸 때 겪는 두 가지 버그와 해결 방법에 대한 글을 첨부합니다. 네트워크 보안 설정 문제:
onResponse() 관련 글: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의 매개 변수 유형Request의Response의 Request의Listener의이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.