[Android]使用RxJava实现 实时搜索、即时搜索

第一篇技术博客,在这里试一下。【PS:除了注释,以下中文内容都是废话,忽略吧】
之前需要实现一边输入一边实时搜索结果的功能,然而搜索到的资料总是有些不如意,最近有同事需要实现同样的功能就把我这半年前的笔记用上了,想想觉得其他小伙伴应该也有需要,顺便我也试一下写技术博文,就把它放出来给大家参考一下,希望能帮到你们。

Talk is cheap. Show you the code.

Third-party libraries

    gson-2.6.2.jar
    okhttp-3.2.0.jar
    okio-1.7.0.jar
    rxAndroid-1.1.0.jar
    rxbinding-0.4.0.jar
    rxjava-1.1.0.jar

Code

public class MainActivity extends AppCompatActivity {
    private EditText et_search;
    private volatile int count = 0;//计数器,用来控制出错

    @Override
    protected void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        et_search = (EditText) findViewById(R.id.et_search);

        timeSearch();

    }

    private void timeSearch() {
        Subscription subscribe = RxTextView.textChanges(et_search)//当EditText发生改变
                //每500毫秒发射一次
                //仅在过了一段指定的时间还没发射数据时才发射一个数据
                //如果原始Observable在这个新生成的Observable终止之前发射了另一个数据, debounce 会抑制(suppress)这个数据项。
                .debounce(500, TimeUnit.MILLISECONDS, AndroidSchedulers.mainThread())

                .subscribeOn(AndroidSchedulers.mainThread())//内容监听操作需要在主线程操作

                //过滤掉EditText没有内容Observable
                .filter(new Func1<CharSequence, Boolean>() {
                    @Override
                    public Boolean call(CharSequence charSequence) {
                        return charSequence.length() > 0;
                    }
                })

                .observeOn(Schedulers.io())

                //当原始Observable发射一个新的数据( Observable) 时,它将取消订阅并停止监视产生执之前那个数据的Observable,只监视当前这一个。
                .switchMap(new Func1<CharSequence, Observable<ShopBean>>() {
                    @Override
                    public Observable<ShopBean> call(CharSequence charSequence) {
                        try {
                            count++;
                            System.out.println("count-->" + count);
                            String resultStr = getShops();
                            ShopBean shopBean = new Gson().fromJson(resultStr, ShopBean.class);
                            Observable<ShopBean> just = Observable.just(shopBean);

                            if (count == 3 || count == 7 || count == 10) {    //出错,将触发retry
                                System.out.println("错");
                                return null;
                            } else {
                                return just;
                            }

                        } catch (IOException e) {
                            return null;
                        }
                    }
                })

                .retry()//凡是请求出错就重试(例如超时、数据解析异常等),直到正确为止。(如果不retry的话就会调用onError。onError会导致整个订阅链条死掉,无法触发下一次了)

//                .retry(3)//最多重试3次,如果次数超了,它不会尝试重新订阅,它会把最新的一个onError通知传递给它的观察者。

//                .retry(new Func2<Integer, Throwable, Boolean>() {
//                    @Override
//                    public Boolean call(Integer integer, Throwable throwable) {
//                        System.out.println("捕获错误并retry-->" + throwable.getMessage());
//                        return true;//如果返回true则再次订阅和镜像原始的Observable,如果返回false则会将最新的一个onError通知传递给它的观察者。
//                    }
//                })

                //展示结果
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Subscriber<ShopBean>() {
                    @Override
                    public void onCompleted() {
                    }

                    @Override
                    public void onError(Throwable e) {
                        System.out.println("错误-->" + e.getMessage());
                        count = 0;
                        timeSearch();//onError或onCompleted都会终止订阅,所以需要重新订阅
                    }

                    @Override
                    public void onNext(ShopBean shopBean) {
                        List<ShopBean.DataBean.ShopsBean> shops = shopBean.getData().getShops();
                        for (int i = 0; i < shops.size(); i++) {
                            System.out.println(shops.get(i).getSshop_n());
                        }
                        System.out.println("-------------");
                    }
                });
    }

    private String getShops() throws IOException {
        String url = "http://192.168.4.25:8088/LGXDJ2/Shops";
        OkHttpClient mOkHttpClient = new OkHttpClient();
        Request.Builder requestBuilder = new Request.Builder().url(url);
        requestBuilder.method("GET", null);
        Request request = requestBuilder.build();
        Call call = mOkHttpClient.newCall(request);
        Response response = call.execute();
        return response.body().string();
    }

}

Thanks

http://www.jianshu.com/p/33c5...
http://blog.csdn.net/johnny90...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值