哥们,RxAndroid很好很强大!!
注:前面说到了Rxjava,介于我们是Android开发人员,有RxAndroid的话我们肯定使用RxAndroid来实现业务啊,今天我就从我项目中抽取一段解析网页的逻辑来说明RxAndroid处理业务的简洁强大之处,可能例子简单,但是适合初学者是不。。。
RxAndroid是啥,他和RxJAva有啥关系
RxAndroid 是 RxJava 的 Android 绑定。其实使用起来也差不多,但是在android中好使,比方说更新主线程UI
上例子 需求:我要使用Jsoup抓取网页源码,然后解析,然后把其中我需要的元素封装到bean中,供我的阅读类App使用,代码如下:
//TODO 下面开始使用rxandroid 进行编程,采用jsoup-1.8.3.jar采集网页 并获取网页上的内容
// 添加 compile 'io.reactivex:rxandroid:1.0.1'
//第一步 创建一个Observable<被观察者>对象,调用create方法
Observable.create(new Observable.OnSubscribe<ResponseArticlesListEntity>() {
@Override
public void call(Subscriber<? super ResponseArticlesListEntity> subscriber) {
try {
//使用Jsoup抓取网页源码
Document result = Jsoup.connect(articleEntity.href).userAgent("Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)").get();
Elements postHeads = null;
Elements postContent1s = null;
switch (article_type) {
case JITANG:
postHeads = result.getElementsByClass("PostHead");
postContent1s = result.getElementsByClass("PostContent1");
break;
case HEIMA:
case HONGHEI:
postHeads = result.getElementsByClass("ATitle");//获得标题
postContent1s = result.getElementsByClass("ADesc");//获得内容简介
break;
}
List<ArticleEntity> list = new ArrayList<ArticleEntity>(postHeads.size());
ResponseArticlesListEntity responseArticlesListEntity = new ResponseArticlesListEntity();
for (int i = 0; i < postHeads.size(); i++) {
ArticleEntity lz13 = new ArticleEntity();
lz13.Type=article_type==ARTICLE_TYPE.JITANG?0:(article_type==ARTICLE_TYPE.HEIMA?1:2);
Element postHead = postHeads.get(i);
Element a = postHead.getElementsByTag("a").get(0);
lz13.href = a.attr("href");
lz13.title = a.text();
Element postContent1 = postContent1s.get(i);
lz13.text = postContent1.text().replace(lz13.title, "");
String[] split = lz13.text.split("\\s{2,}");//匹配至少两次 //匹配任何空白字符,包括空格、制表符、换页符等。与 [ \f\n\r\t\v] 等效
StringBuffer sb = new StringBuffer();
for (String s : split) {
if (TextUtils.isEmpty(s)) {
continue;
}
if (lz13.title.equals(s)) {
continue;
}
if (s.matches("\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}")) {
//2016-02-01 14:54:27
continue;
}
if (s.startsWith("文/")) {
lz13.auth = s;
continue;
}
sb.append(" ").append(s).append("<br/>");
}
int index = sb.lastIndexOf("<br/>");
if (index == -1) continue;
lz13.text = sb.substring(0, sb.lastIndexOf("<br/>") - 1) + "......";
list.add(lz13);
}
responseArticlesListEntity.setResult(list);
//网页解析成功,填充到bean后,执行onNext
subscriber.onNext(responseArticlesListEntity);
} catch (Exception e) {
e.printStackTrace();
//网页解析失败,填充到bean后,执行onNext(null)
subscriber.onNext(null);
}
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())//规定到主线程中运行
.subscribe(new Action1<ResponseArticlesListEntity>() {
@Override
public void call(ResponseArticlesListEntity responseArticlesListEntity) {
//这里就是主线程,通过接口吧数据返回到Activity或者Fragment中显示并更新UI
if (null == responseArticlesListEntity) {
loadedListener.onError(null);
} else {
loadedListener.onSuccess(event_tag, responseArticlesListEntity);
}
}
});
从上面的例子我们可以看出,这个业务逻辑很简单就实现了,并且不用一些runui之类的方法,直接刷新UI效果,并且一目了然!!
这次也只是起一个抛砖引玉的作用,来介绍RXAndroid的使用,后面还有详细业务帖子,敬请期待!!
|