Android:SAX解析器进度监控

标签 android xml sax saxparser

我有一个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/

相关文章:

android - Webkit 在 ASP.NET 3.5 页面中点击突出显示颜色,包括 ScriptManager

java - 如何解决错误 : Java class cannot be instantiated in XML layout in android?

c# - 反序列化异常处理

java - 为什么 Spring Boot 2.5.0 JMX Beans 没有显示在 JConsole 中

java - 如何修复无法解析符号 'activity_main' ?

java - SAX 解析器返回空字符串

安卓三星计算器

java - 在不触发提交按钮的情况下验证编辑文本

java - 为什么 SAXParser 在抛出事件之前读取这么多?

xml - 深度优先读取大型 XML 文件