我有一个SAX
DefaultHandler它解析一个 InputStream。我不知道 XML 中有多少元素,所以我无法在 endElement
或类似的元素上计算它们。我确实知道 InputStream
的字节长度(从 http header 读取),但我找不到一种方法来获取解析过程的当前字节进度。
有没有办法获取解析过程的当前进度(即处理的位)?
这就是调用 DefaultHandler
的方式:
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
parser.parse(inputStream, myDefaultHandler);
最佳答案
对于仍在寻找答案的任何人, 尝试在派生的 FilterInputStream 的构造函数中传递 ProgressBar:
ProgressFilterInputStream.java
import java.io.FilterInputStream;
import java.io.InputStream;
import java.io.IOException;
import android.widget.ProgressBar;
import android.util.Log;
public class ProgressFilterInputStream extends FilterInputStream {
int counter = 0;
ProgressBar progressBar;
public ProgressFilterInputStream(InputStream in, ProgressBar progressBar) {
super(in);
this.progressBar = progressBar;
this.progressBar.setMax(69); // SET MAX ACCORDIN TO THE DDMS LOGGING MESSAGE
}
@Override
public int read(byte[] buffer, int offset, int count) throws IOException {
progressBar.setProgress(counter++);
Log.i("PFIS" , "Counter: " + counter);
return super.read(buffer, offset, count);
}
}
我在我的 AsyncTask 中使用了它
MyActivity.java
final ProgressBar bar_progress = (ProgressBar) findViewById(R.id.bar_progress);
ProgressFilterInputStream pfis = new ProgressFilterInputStream(getAssets().open("DATA.xml") , bar_progress );
Reader reader = new InputStreamReader(pfis, "UTF-8");
InputSource is = new InputSource(reader);
// create the factory
SAXParserFactory factory = SAXParserFactory.newInstance();
// create a parser
SAXParser parser = factory.newSAXParser();
// create the reader (scanner)
XMLReader xmlreader = parser.getXMLReader();
// instantiate our handler
SaxHandler myHandler = new SaxHandler();
// assign our handler
xmlreader.setContentHandler(myHandler);
// perform the synchronous parse
xmlreader.parse(is);
关于Android:SAX解析器进度监控,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5015856/