第一篇技术博客,在这里试一下。【PS:除了注释,如下中文内容都是废话,忽略吧】
以前须要实现一边输入一边实时搜索结果的功能,然而搜索到的资料老是有些不如意,最近有同事须要实现一样的功能就把我这半年前的笔记用上了,想一想以为其余小伙伴应该也有须要,顺便我也试一下写技术博文,就把它放出来给你们参考一下,但愿能帮到大家。java
Talk is cheap. Show you the code.ide
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...ui