RxAndroid+Vollyを組み合わせて使う簡単な例

6812 ワード

  • 本明細書では、どのようにVollyのコールバックモードをRxAndroidと結合して使用するかを簡単に説明する.RxAndroidを使う主な原因はチェーンコードを実現できて、コードが綺麗です.Vollyを使う主な原因は大工場の製品の品質が保障されています.プロジェクトに関するネット要求も比較的簡単です.
  • 結合使用手順:
    1.必要な資源を導入する:
    compile 'com.android.volley:volley:1.0.0'
    compile 'io.reactivex:rxandroid:1.2.1'
    
    2.まず自分の要求クラスをカスタマイズする
    カスタム要求クラスHttpJsonRequestは、このクラスはcom.android.volley.Requestに継承され、vollyはいくつかの自己定義された要求クラスがあり、必要に応じてcom.android.volley.toolboxで使用される.ここではRxAndrodとの結合のために、伝統的なキーパッド対形式のパラメータを伝えるために、カスタマイズされたものを採用しています.HttpJsonRequest.javaは以下の通りである
    import java.util.List;
    import org.json.JSONObject;
    import android.text.TextUtils;
    import com.android.volley.DefaultRetryPolicy;
    import com.android.volley.NetworkResponse;
    import com.android.volley.ParseError;
    import com.android.volley.Request;
    import com.android.volley.Response;
    import com.android.volley.VolleyError;
    import com.android.volley.toolbox.HttpHeaderParser;
    import rx.Observer;
    
    public class HttpJsonRequest extends Request {
    
        private final String PROTOCOL_CHARSET = "utf-8";
    
        /**
         *        
         */
        private List mParams;
    
        /**
         *    ,      ,      、     
         */
        private Observer super JSONObject> mObserver;
    
        public HttpJsonRequest(int method, String url, List params, Observer super JSONObject> observer) {
            super(method, url, null);
            mObserver = observer;
            mParams = params;
    
            //               
            setRetryPolicy(new DefaultRetryPolicy(60000, 0, 1.0f));
        }
    
        /**
         *        !!!
         *              ,   onCompleted();
         */
        @Override
        protected void deliverResponse(JSONObject response) {
            mObserver.onNext(response);
            mObserver.onCompleted();
        }
    
        /**
         *        !!!
         *      ,    
         */
        @Override
        public void deliverError(VolleyError error) {
            mObserver.onError(error);
        }
    
        @Override
        protected Response parseNetworkResponse(NetworkResponse response) {
            try {
                String jsonString = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
                if (TextUtils.isEmpty(jsonString)) {
                    return Response.success(new JSONObject(), HttpHeaderParser.parseCacheHeaders(response));
                } else {
                    return Response.success(new JSONObject(jsonString), HttpHeaderParser.parseCacheHeaders(response));
                }
            } catch (Exception e) {
                return Response.error(new ParseError(e));
            }
        }
    
        /**
         *                     ,        ;
         *             ,      Request getParams()    ,        getBody(),                   
         * Volley.toolbox          request,  com.android.volley.toolbox.JsonObjectRequest,     json  ;
         *      ,         ,      getBody()        。
         */
        @Override
        public byte[] getBody() {
            String paramStr;
            if (mParams == null) {
                paramStr = "";
            } else {
                StringBuilder params = new StringBuilder();
                for (ParamItem p : mParams) {
                    params.append("&").append(p.getKey()).append("=").append(p.getValue());
                }
    
                paramStr = params.toString();
                if (paramStr.length() > 0) {
                    //      &
                    paramStr = paramStr.substring(1);
                }
            }
    
            try {
                return paramStr.getBytes(PROTOCOL_CHARSET);
            } catch (Exception uee) {
                throw new RuntimeException("Encoding not supported: " + PROTOCOL_CHARSET, uee);
            }
        }
    }
    
    ここで注意すべき点は、コードのコメントを参照してください.その核心はdeliverResponsedeliverErrorの2つの方法の書き換えであり、元の方式はvolley.toolboxの下のいくつかの要求種類のソースコードを見ることができます.
    3.初期化要求キュー及び加入要求、キャンセル要求方法
    private RequestQueue mRequestQueue;
    
    /**
     *       
     */
    public RequestQueue getRequestQueue() {
        if (mRequestQueue == null) {
            mRequestQueue = Volley.newRequestQueue(this);
        }
        return mRequestQueue;
    }
    
    /**
     *          ,,    TAG;
     *   tag             ,       cancelALl       
     */
    public  void addToRequestQueue(Request req, Object tag) {
        addToRequestQueue(req, tag.getClass().getSimpleName());
    }
    
    private  void addToRequestQueue(Request req, String tag) {
        req.setTag(tag);
        BuglyLog.d(TAG, "       :" + req.getUrl());
    
        getRequestQueue().add(req);
    }
    
    /**
     *     TAG   ,   onDestory()   
     */
    public void cancelPendingRequests(Object tag) {
        cancelPendingRequests(tag.getClass().getSimpleName());
    }
    
    private void cancelPendingRequests(String tag) {
        BuglyLog.e(TAG, "        TAG   :" + tag);
        if (mRequestQueue != null) {
            mRequestQueue.cancelAll(tag);
        }
    }
    
    これは何も言いにくいことではないですが、もしあなたがオカルトを集めたいなら、Volley.newRequestQueue(this)ここで文章を作るということです.
    4.RxAndroidとVollyを結合して使用する.
    主なコードは以下の通りです.
    /**
     *     
     */
    private void doRegister(String email, String password) {
        int versionCode = com.afap.utils.Utils.getAppVersionCode(getContext());
        String sdk = Build.VERSION.RELEASE;
    
    
        Observable.create(new Observable.OnSubscribe() {
            @Override
            public void call(final Subscriber super JSONObject> subscriber) {
                String url = "http://www.weather.com.cn/data/cityinfo/101010100.html";
                List params = new ArrayList<>();
                HttpJsonRequest request = new HttpJsonRequest(Request.Method.GET, url, null, subscriber);
                MyApplication.getInstance().addToRequestQueue(request, RegisterFormFragment.this);
            }
        })
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer() {
                    @Override
                    public void onCompleted() {
                        BuglyLog.i(TAG, "Observer.onCompleted");
                    }
    
                    @Override
                    public void onError(Throwable e) {
                        e.printStackTrace();
                        BuglyLog.e(TAG, "Observer.onError");
                    }
    
                    @Override
                    public void onNext(JSONObject json) {
                        BuglyLog.i(TAG, "Observer.onNext");
                        BuglyLog.i(TAG, json.toString());
                    }
                });
    }
    
    @Override
    public void onDestroy() {
        MyApplication.getInstance().cancelPendingRequests(this);
    
        super.onDestroy();
    }
    
    以上、すでにVollyとRxAndroidを串刺しにしました.最も重要なステップはdeliverResponsedeliverErrorです.