RxAndroid+Vollyを組み合わせて使う簡単な例
6812 ワード
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);
}
}
}
ここで注意すべき点は、コードのコメントを参照してください.その核心はdeliverResponse
とdeliverError
の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を串刺しにしました.最も重要なステップはdeliverResponse
とdeliverError
です.