您的位置:首页 > Web前端 > HTML

深入分析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对象中的数据
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: