WebView的高级用法

WebView通常用于加载某个网页,如下

mWebView.loadUrl(mUrl);

然而在有些情况下,我们只需加载网页的某一部分,而非全部。如新闻页只需加载标题和正文,而摒弃广告、侧边栏等。如何解决这个问题呢?

接下来我们将从以下四个步骤展开:

Created with Raphaël 2.1.0 抓取指定url的网页html 抽取网页中指定标签,生成本地数据结构 根据数据结构生成本地Html WebView加载本地Html

以上步骤分别对应四个模块:Crawler、Parser、Renderer、Loader

在Crawler和Parser中,涉及到一款重要的工具——Jsoup

Jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。

具体可参考官网:http://jsoup.org/

接下来,将从代码层面依次描述以上各模块的实现。

先给出总体框架:

public void loadRemotePage(String url) {
    WebPageTransformer.transform(url, new IWebPageTransformer() {

        @Override
        public void onPageTransform(String content) {
            // TODO Auto-generated method stub
            loadLocalPage(content);
        }

    });
}

public class WebPageTransformer {

    public static interface IWebPageTransformer {
        public void onPageTransform(String content);
    }

    public static void transform(final String url, final IWebPageTransformer transformer) {
        AsyncTaskUtils.execute(new AsyncTask<Void, Void, String>() {

            @Override
            protected String doInBackground(Void... params) {
                // TODO Auto-generated method stub
                Document doc = ArticleCrawler.crawlWebPage(url);
                Article article = ArticleParser.parseArticle(doc);
                return ArticleRender.render(article);
            }

            @Override
            protected void onPostExecute(String html) {
                // TODO Auto-generated method stub
                if (transformer != null) {
                    transformer.onPageTransform(html);
                }
            }

        });
    }


}

接下来是Crawler,功能很简单,用get方式抓取指定url的html,如下

public class ArticleCrawler {

    public static Document crawlWebPage(String url) {
        try {
            Document document = Jsoup.connect(url)
                    .userAgent("Mozilla").get();
            return document;
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }
}

然后是Parser,用于抽取Crawler所得到的网页Html中感兴趣的标签,生成本地数据结构

public class ArticleParser {

    public static Article parseArticle(Document doc) {
        Article article = new Article();

        Element titleElem = doc.getElementById("artical_topic");
        if (titleElem != null) {
            Title title = new Title();
            title.setText(titleElem.text());
            article.addElementRender(title);
        }

        Elements elements = doc.select("div#main_content p");

        for (Element element : elements) {
            if (element.hasClass("detailPic")) {
                Elements images = element.select("img");
                String src = images.get(0).attr("src");

                if (!TextUtils.isEmpty(src)) {
                    Image image = new Image();
                    image.setUrl(src);
                    image.setImageSize();
                    article.addElementRender(image);
                }
            } else {
                Span span = new Span();
                span.setText(element.text());
                article.addElementRender(span);
            }
        }

        return article;
    }
}

接下来该由Renderer渲染本地数据结构,生成本地Html

public class ArticleRender {

    public static String render(Article article) {
        StringBuilder sb = new StringBuilder();

        List<ElementRender> renders = article.getElementRenders();

        for (ElementRender render : renders) {
            sb.append(render.getRenderHtml());
        }

        return sb.toString();
    }
}

最后,由WebView加载渲染后的本地Html即可

public void loadLocalPage(String content) {
    String template = CommonUtils.getFileFromAssets(mContext, "newscont.html");
    template = template.replace("{{template_content}}", content);
    template = template.replace("{{webview_width}}", "" + CommonUtils.getScreenWidthIntPx());
    template = template.replace("{{webview_height}}", "" + CommonUtils.getScreenHeightIntPx());
    loadDataWithBaseURL("file:///android_asset/", template, "text/html", "UTF-8", null);
}

总体基本上就是这些,然而还有诸多细节,如图片如何加载,本地html样式如何调整等问题我们后面再讨论。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风语

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值