RxAndroid初学记录

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





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章