第一篇技术博客,在这里试一下。【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...
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。