深入分析Htmi中的fromHtml函数
2015-12-18 11:05
691 查看
今天决定好生把Htmi中的fromHtml()函数仔细的分析一下:
首先进入它的源码:有三个参数:1.string对象 2.ImageGetter对象 3. TagHandler对象
public static Spanned fromHtml(String source, ImageGetter imageGetter,
TagHandler tagHandler) {
//分配一个parser对象, Parser为一个(解析器)接口,解析Sax格式
Parser parser = new Parser();
try {
//此句我一直没有想通setProperty(Parser.schemaProperty, HtmlParser.schema);从何而来
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);
}
//此处是重点,处理imagegetter对象;
HtmlToSpannedConverter converter =
new HtmlToSpannedConverter(source, imageGetter, tagHandler,
parser);
//此处调用也属于重点:分析它的源码如下,HtmlToSpannedConverter 为一个内部类
//convert();为Html中的函数:并且没搞懂为什么·要这么调用,
return converter.convert();
}
\随后我又跟着进入了 HtmlToSpannedConverter 的源码:
分析了一下它的构造函数: public HtmlToSpannedConverter(
String source, Html.ImageGetter imageGetter, Html.TagHandler tagHandler,
Parser parser) {
mSource = source;
mSpannableStringBuilder = new SpannableStringBuilder();
//imagegettter对象被传入了HtmlToSpannedConverter类对象中的ImageGetter对象
mImageGetter = imageGetter;
mTagHandler = tagHandler;
mReader = parser;
}
//convert的函数源码如下:
public Spanned convert() {
//mReader为一个XMLreader接口对象
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);
}
// Fix flags and range for paragraph-type markup.
Object[] obj = mSpannableStringBuilder.getSpans(0, mSpannableStringBuilder.length(), ParagraphStyle.class);
for (int i = 0; i < obj.length; i++) {
int start = mSpannableStringBuilder.getSpanStart(obj[i]);
int end = mSpannableStringBuilder.getSpanEnd(obj[i]);
// If the last line of the range is blank, back off by one.
if (end - 2 >= 0) {
if (mSpannableStringBuilder.charAt(end - 1) == '\n' &&
mSpannableStringBuilder.charAt(end - 2) == '\n') {
end--;
}
}
if (end == start) {
mSpannableStringBuilder.removeSpan(obj[i]);
} else {
mSpannableStringBuilder.setSpan(obj[i], start, end, Spannable.SPAN_PARAGRAPH);
}
}
/ /返回一个SpannableStringBuilder对象:
return mSpannableStringBuilder;
}
其实最终操纵的都是SpannableStringBuilder对象中的数据
首先进入它的源码:有三个参数:1.string对象 2.ImageGetter对象 3. TagHandler对象
public static Spanned fromHtml(String source, ImageGetter imageGetter,
TagHandler tagHandler) {
//分配一个parser对象, Parser为一个(解析器)接口,解析Sax格式
Parser parser = new Parser();
try {
//此句我一直没有想通setProperty(Parser.schemaProperty, HtmlParser.schema);从何而来
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);
}
//此处是重点,处理imagegetter对象;
HtmlToSpannedConverter converter =
new HtmlToSpannedConverter(source, imageGetter, tagHandler,
parser);
//此处调用也属于重点:分析它的源码如下,HtmlToSpannedConverter 为一个内部类
//convert();为Html中的函数:并且没搞懂为什么·要这么调用,
return converter.convert();
}
\随后我又跟着进入了 HtmlToSpannedConverter 的源码:
分析了一下它的构造函数: public HtmlToSpannedConverter(
String source, Html.ImageGetter imageGetter, Html.TagHandler tagHandler,
Parser parser) {
mSource = source;
mSpannableStringBuilder = new SpannableStringBuilder();
//imagegettter对象被传入了HtmlToSpannedConverter类对象中的ImageGetter对象
mImageGetter = imageGetter;
mTagHandler = tagHandler;
mReader = parser;
}
//convert的函数源码如下:
public Spanned convert() {
//mReader为一个XMLreader接口对象
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);
}
// Fix flags and range for paragraph-type markup.
Object[] obj = mSpannableStringBuilder.getSpans(0, mSpannableStringBuilder.length(), ParagraphStyle.class);
for (int i = 0; i < obj.length; i++) {
int start = mSpannableStringBuilder.getSpanStart(obj[i]);
int end = mSpannableStringBuilder.getSpanEnd(obj[i]);
// If the last line of the range is blank, back off by one.
if (end - 2 >= 0) {
if (mSpannableStringBuilder.charAt(end - 1) == '\n' &&
mSpannableStringBuilder.charAt(end - 2) == '\n') {
end--;
}
}
if (end == start) {
mSpannableStringBuilder.removeSpan(obj[i]);
} else {
mSpannableStringBuilder.setSpan(obj[i], start, end, Spannable.SPAN_PARAGRAPH);
}
}
/ /返回一个SpannableStringBuilder对象:
return mSpannableStringBuilder;
}
其实最终操纵的都是SpannableStringBuilder对象中的数据
相关文章推荐
- html 的select标签不能够设置height
- AFNetWorking支持解析html的方法
- html修炼养成--怎样使用Swiper
- 解决HTML表格连续超长英文字符串不能正确换行问题
- html input标签的type属性的使用
- html修炼养成--关于在swiper中添加动画的方法
- html table
- Html在网页、页面中放置Swf、Flash 背景
- HTML插入SWF
- innerHTML 属性
- 在HTML中src和href的区别
- html embed用法
- Razor和HtmlHelper的使用意义
- HTML - 键盘事件
- HTML中DIV与SPAN的区别
- 伪静态是什么?伪静态与普通html静态网页区别?
- html乱码原因与网页乱码解决方法
- html使用include出现乱码乱字符号解决方法
- 如何选择使用的HTML标签
- xml+xsl与html的结合