上一篇文章简单介绍了Html.fromHtml的用法,继续分析其中的实现,该方法的第三个参数TagHandler
,该参数为Html里的一个内部静态接口,该接口里边定义了一个方法
public void handleTag(boolean opening, String tag, Editable output, XMLReader xmlReader);
该方法接收四个参数,我们重点看一下最后一个参数XMLReader xmlReader
,是不是很眼熟?在XML解析中我们遇到过。我们再来看一下fromHtml
方法里的实现:
public static Spanned fromHtml(String source, ImageGetter imageGetter,
TagHandler tagHandler) {
Parser parser = new Parser();
try {
parser.setProperty(Parser.schemaProperty, HtmlParser.schema);
} catch (org.xml.sax.SAXNotRecognizedException e) {
// Should not happen.
throw new RuntimeException(e);
} catch (org.xml.sax.SAXNotSupportedException e) {
// Should not happen.
throw new RuntimeException(e);
}
HtmlToSpannedConverter converter =
new HtmlToSpannedConverter(source, imageGetter, tagHandler,
parser);
return converter.convert();
}
第一行Parser parser = new Parser();
这里提供一个关于该类的链接,有兴趣的同学可以自己查看源码,源码比较多:org.ccil.cowan.tagsoup.Parser,这里我们重点看一下converter.convert()
这个方法:
mReader.setContentHandler(this);
try {
mReader.parse(new InputSource(new StringReader(mSource)));
} catch (IOException e) {
// We are reading from a string. There should not be IO problems.
throw new RuntimeException(e);
} catch (SAXException e) {
// TagSoup doesn't throw parse exceptions.
throw new RuntimeException(e);
}
这里贴该方法的代码片段,其中mReader
就是在构建HtmlToSpannedConverter
对象的时候传过来的Parser对象。HtmlToSpannedConverter
类实现了ContentHandler
接口,convert
方法的第一行就是mReader.setContentHandler(this);
此时执行mReader.parse(new InputSource(new Strin