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);//獲取數據
        }
    });





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