Android Studio使用RxAndroid需要在app下的gradle文件配置如下:(個人使用了RxBinding,所以會有相關的支持)
<pre name="code" class="java"> compile 'io.reactivex:rxandroid:1.2.1'
compile 'io.reactivex:rxjava:1.1.9'
compile 'com.jakewharton.rxbinding:rxbinding:0.4.0'
使用傳統的OnClickListener監聽:
Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
login();//請求網絡,登錄
}
});
此時若手指抖動,多點擊幾次屏幕,此時我在1s內連續點擊三次屏幕,則可以看到日誌輸出,此時訪問了三次網絡
使用RxBinding去監聽控件的點擊:
Button button = (Button) findViewById(R.id.button);
RxView.clicks(button)
.throttleFirst(500, TimeUnit.MILLISECONDS)//消除手指抖動造成的多次連擊
.subscribe(new Action1<Void>() {
@Override
public void call(Void aVoid) {
login();
}
});
此時我在1s內多次點擊屏幕,日誌輸出如下,只訪問一次網絡請求
使用throttleFirst設置,可以消除手指抖動時造成的多次點擊響應
使用RxAndroid+Okhttp訪問網絡請求數據:
public static Observable postRequest(final String url, final Map<String, String> params){
return Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
FormBody.Builder builder = new FormBody.Builder();
for (String key : params.keySet())
builder.add(key, params.get(key));
FormBody build = builder.build();
Request request = new Request.Builder().url(url).post(build).build();
OkHttpClient okHttpClient = new OkHttpClient();
try {
Response response = okHttpClient.newCall(request).execute();
if (response.code() == 200)
if (!subscriber.isUnsubscribed())
subscriber.onNext(response.body().string());
} catch (IOException e) {
subscriber.onError(e);
} finally {
subscriber.onCompleted();
}
}
});
}
調用方法如下:
postRequest(url, params).subscribeOn(Schedulers.io())//在io線程中獲取網絡數據
.observeOn(AndroidSchedulers.mainThread())//執行操作在UI線程
.subscribe(new Observer<String>() {
@Override
public void onCompleted() {
Log.e(TAG, "onCompleted");//當所有的onNext()調用完成後會調用此方法結束
}
@Override
public void onError(Throwable e) {
Log.e(TAG, e.getMessage());
}
@Override
public void onNext(String s) {
Log.e(TAG, s);//獲取數據
}
});