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()
String
Response.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에 따라 라이센스가 부여됩니다.