黑马程序员技术交流社区

标题: 哥们,RxAndroid很好很强大!! [打印本页]

作者: 胡焱老师    时间: 2016-3-28 20:11
标题: 哥们,RxAndroid很好很强大!!
哥们,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的使用,后面还有详细业务帖子,敬请期待!!




作者: 潘耿威    时间: 2016-3-28 20:43
好崇拜啊----我又学到了一定
作者: qiergg    时间: 2016-7-4 20:15
学习了,赞一个,棒棒的
作者: 孟小垚    时间: 2016-7-4 20:38
还没就业班,先看看,学习学习!谢谢分享
作者: 349153256    时间: 2016-12-20 17:56
asdasdasdasdasd




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2