Androidのネットワークプログラミングシリーズ(6)バレーボール独自のリクエスト

記事はStr​​ingRequest、JsonRequest、ImageRequest、ImageLoaderおよび他の使用を含む基本的な使い方バレーボールフレームワークが導入されています。この記事では、さまざまなシナリオに適用する、実現独自のリクエストを所有しています。

XMLRequest

我々は1つがXMLで、1はJSONで、ネットワークデータは、2つのフォーマットで通常利用可能であることを知っています。バレーボールはすでに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データを、解析するPullメソッドを使用します。まず、データのコールバック要求のリスナーリスナーオブジェクトのための一般的なXmlPullParserコールバックの定義が成功した(失敗したコールバック要求は同じですが、要求が成功したときに返されるさまざまなデータ型は、コールバックは同じではありません)。コンストラクタでコールバックの割り当て、コンストラクタは、コンストラクタは4つのパラメータの三つのパラメータのコンストラクタを呼び出し、文言にStringRequestをも模倣されます。継承されたリクエスト親の後、その2つの抽象メソッド、すなわちによって覆われている必要がありますparseNetworkResponse() deliverResponse()これらの2つの方法の役割を説明するのに次の、。

保護された応答parseNetworkResponse(NetworkResponse応答)

この方法は、別のメソッドを呼び出すことに応答して、応答結果に応じて、要求の結果に応じて、ネットワークを解決するために使用されます。メソッド呼び出しが失敗に応答して、XmlRequestで最初の応答で応答データを取得し、データエラー(要求が失敗した、分析誤差などの場合に)場合、次いで、その後、XmlPullParserフォーマットにそれを解析成功した方法に応じて呼び出します。

保護された無効deliverResponse(T応答)

このメソッドは、コールバック正常な応答データに使用され、すでに良好な応答機能に運ばれ、この関数のパラメータを見ることができ、データ解析(例えばStringRequest応答データとしてはString型である、XmlRequestはXmlPullParserタイプです)。このコールバック関数は、さらなる処理のために要求アクティビティデータのインスタンスにこのデータを吸引され、解析されたデータは、典型的には、UIに表示されます。

今後の記事では、我々はこれらの2つの原則と全体バレーボールの機能の背後にあるプロセスを説明します。

GsonResquest

実際には、最後のXMLRequest後、我々は独自のリクエストの主なポイントの一般的な理解を持っていることを実現します。ここでは、データ分析の実装でGsonRequestペーストは自動的期間JSONオブジェクトのエンティティクラスにデータをマッピングすることができますJSON Gson Googleのオープンソースフレームワークです。(それだけでJSONデータの一部を必要とする場合があるため)もちろん、この事実は、リクエストをカスタマイズする必要はありません、Gsonはのみで、結果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にマッピングされるエンティティ・クラスのタイプを指定する必要があるためです。

エピローグ

ここで、この独自のリクエストは、記事の内容のほとんどは、このブログで、次の郭林先生から派生されています。

Androidのボレーは完全に彼らの要求をカスタマイズし、(C)を解決します

おすすめ

転載: juejin.im/post/5d64aa74518825168e6a18ce