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);//获取数据
}
});