안드로이드 네트워크 프로그래밍 시리즈 (6) 발리 사용자 지정 요청

이 기사는 StringRequest, JsonRequest, ImageRequest,하여 ImageLoader 및 기타 사용을 포함한 기본적인 사용 발리 프레임 워크를 소개합니다. 이 문서에서 우리는 다양한 시나리오에 적용, 구현 사용자 지정 요청을 소유하고 있습니다.

XMLRequest

우리는 하나의 XML입니다, 하나는 JSON, 즉 네트워크 데이터는 두 가지 형식에서 일반적으로 볼 수 있습니다 알고 있습니다. 발리 이미 JsonRequest을 가지고 있기 때문에, 그래서 우리는 지금 너 자신 XMLRequest 알고 있습니다.

볼 StringRequest 것은 달성하는 방법입니다 :

public class StringRequest extends Request<String> {

    /** Lock to guard mListener as it is cleared on cancel() and read on delivery. */
    private final Object mLock = new Object();

    // @GuardedBy("mLock")
    private Listener<String> mListener;

    public StringRequest(int method, String url, Listener<String> listener,
            ErrorListener errorListener) {
        super(method, url, errorListener);
        mListener = listener;
    }

    public StringRequest(String url, Listener<String> listener, ErrorListener errorListener) {
        this(Method.GET, url, listener, errorListener);
    }

    @Override
    public void cancel() {
        super.cancel();
        synchronized (mLock) {
            mListener = null;
        }
    }

    @Override
    protected void deliverResponse(String response) {
        Response.Listener<String> listener;
        synchronized (mLock) {
            listener = mListener;
        }
        if (listener != null) {
            listener.onResponse(response);
        }
    }

    @Override
    protected Response<String> 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));
    }
}
复制代码

당신은 코드 내부 StringRequest는 대부분의 작업은 부모 클래스에서 구현 된 매우 작은 볼 수 있습니다.

사용자 지정 요청을위한 기본 단계 :

  1. 성공적인 응답 콜백 리스너 만들기
  2. 쓰기 생성자
  3. 추상 메소드는 부모 클래스를 겹쳐 성공 콜백 요청 및 결과 데이터에 대한 응답으로 네트워크를 분석합니다.

여기 XMLRequest 코드는 다음과 같습니다

public class XMLRequest extends Request<XmlPullParser> {

    //锁
    private Object mLock = new Object();

    //请求成功的回调
    private Response.Listener<XmlPullParser> listener;

    //带有请求方式的构造函数
    public XMLRequest(int method, String url, Response.Listener<XmlPullParser> listener,
                      Response.ErrorListener errorListener) {
        super(method, url, errorListener);
        this.listener = listener;
    }
    //默认请求方式为GET的构造函数
    public XMLRequest(String url, Response.Listener<XmlPullParser> listener,
                      Response.ErrorListener errorListener) {
        this(Method.GET, url,listener, errorListener);
    }

    //解析网络请求结果
    @Override
    protected Response<XmlPullParser> 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) {
        synchronized (mLock){
            listener.onResponse(response);
        }
    }

    //取消请求
    @Override
    public void cancel() {
        super.cancel();
        synchronized (mLock){
            listener = null;
        }
    }
}
复制代码

여기에서 우리는이 클래스 XmlPullParser 여기에 사용 된 XML 데이터를 구문 분석 끌어 오기 방법을 사용합니다. 첫째, 데이터 콜백 요청에 대한 리스너 리스너 객체에 대한 일반적인 XmlPullParser 콜백의 정의에 성공 (실패 콜백 요청은 동일하지만, 요청이 성공하면 반환되는 다른 데이터 유형, 콜백은 동일하지 않습니다). 생성자에서 콜백 할당, 생성자는 생성자가 네 개의 매개 변수의 세 가지 매개 변수의 생성자를 호출 문구에 StringRequest을 모방한다. 상속 요청 부모 후, 두 개의 추상 메소드, 즉 적용해야 parseNetworkResponse () deliverResponse () 이 두 가지 방법의 역할을 설명 할 다음.

보호 응답 parseNetworkResponse (NetworkResponse 응답)

이 방법은 다른 방법을 호출에 응답하여, 상기 응답의 결과에 따라, 상기 요청의 결과에 응답하여 네트워크를 분석하는 데 사용된다. 메소드 호출 실패에 응답하여, XmlRequest 먼저 응답하여 응답 데이터를 획득하고, 데이터 에러 (요청 실패, 분석 오차 등의 경우)이라면, 그리고, XmlPullParser 형식으로 파싱 성공적인 방법에 응답하여 호출한다.

보호 deliverResponse 공극 (T 응답)

이 방법은 콜백 성공적인 응답 데이터에 사용됩니다, 당신은 이미 좋은 반응 함수에 수행이 함수의 매개 변수를 볼 수있는 데이터 분석 (예 : StringRequest 응답 데이터로는 String 형으로, XmlRequest는 XmlPullParser 유형입니다). 이 콜백 함수는 추가 처리를 위해 요청 활동 데이터 인스턴스화이 데이터를 흡입하고, 파싱 된 데이터는 일반적으로 UI에 표시된다.

후속의 기사는 우리는이 두 가지 원칙과 전체 발리의 기능 뒤에 과정을 설명합니다.

GsonResquest

사실, 지난 XMLRequest 후 우리는 사용자 요청의 주요 지점에 대한 일반적인 이해를 가지고 있음을 알고 있습니다. 다음은 데이터 분석의 구현에서 GsonRequest 붙여 넣기가 자동으로 기간 JSON 객체 엔티티 클래스에 데이터를 매핑 할 수있는 JSON GSON 구글 오픈 소스 프레임 워크입니다. 물론,이 사실이 요청을 사용자 정의 할 필요가 없습니다, GSON 단지 (단지 데이터의 JSON 부분에해야 할 수 있기 때문에)의 결과 StringRequest에 대한 응답으로 추가해야합니다.

다음은 구체적인 구현입니다 :

public class GsonRequest<T> extends Request<T> {
    private Response.Listener<T> listener;
    private Gson mGson;
    private Class<T> mClass;

    public GsonRequest(int method, String url, Class<T> clazz, Response.Listener<T> listener,
                       Response.ErrorListener errorListener) {
        super(method, url, errorListener);
        mGson = new Gson();
        this.mClass = clazz;
        this.listener = listener;
    }

    public GsonRequest(String url, Class<T> clazz, Response.Listener<T> listener,
                       Response.ErrorListener errorListener) {
        this(Method.GET, url, clazz, listener, errorListener);
    }


    @Override
    protected Response<T> parseNetworkResponse(NetworkResponse response) {
        try {
            String jsonString = new String(response.data,
                    HttpHeaderParser.parseCharset(response.headers));
            return Response.success(mGson.fromJson(jsonString,mClass),
                    HttpHeaderParser.parseCacheHeaders(response));
        } catch (UnsupportedEncodingException e) {
            return Response.error(new ParseError(e));
        }
    }

    @Override
    protected void deliverResponse(T response) {
        listener.onResponse(response);
    }
}
复制代码

유의해야 할 점은 생성자의 클래스 <T> 멤버 변수 mClass 유형 및 할당을 추가하는 것이다. ** mGson.fromJson parseNetworkResponse () 메소드 (jsonString, mClass가) **이 줄의 코드가 명시 적으로 JSON을 매핑 될 엔티티 클래스의 유형을 지정해야하기 때문입니다.

발문

여기에이 사용자의 요청이 기사의 내용의 대부분은이 블로그 다음 구오 린 교사에서 파생됩니다 :

안드로이드 발리는 완전히 (C), 자신의 요청을 사용자 정의 해결

추천

출처juejin.im/post/5d64aa74518825168e6a18ce