移動設備內存受限,解析大型本地 XML 文件時,**Pull 解析 (XmlPullParser) 是性能與內存的最佳平衡點**。
| 解析器 | 模式 | 內存佔用 | 速度 | API 複雜度 | 適用場景 |
|---|---|---|---|---|---|
| DOM | 樹模型 | 極高 (全量載入 DOM 樹) | 中 | 低 (樹遍歷直觀) | 小文件、需隨機訪問、修改 XML |
| SAX | 事件推送 | 極低 (流式) | 快 | 高 (需維護狀態機) | 大文件、單次順序讀取、內存極限環境 |
| Pull (XmlPullParser) | 事件拉取 | 低 (流式) | 快 | 中 (循環調用 next()) | 大文件、需隨時停止/繼續、Android 系統內置優化 |
public List- parseXml(InputStream inputStream) throws XmlPullParserException, IOException {
XmlPullParser parser = Xml.newPullParser();
parser.setInput(inputStream, "UTF-8");
List
- items = new ArrayList<>();
Item current = null;
int eventType = parser.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
switch (eventType) {
case XmlPullParser.START_TAG:
String tag = parser.getName();
if ("item".equals(tag)) {
current = new Item();
current.id = parser.getAttributeValue(null, "id");
} else if (current != null) {
if ("title".equals(tag)) current.title = parser.nextText();
else if ("link".equals(tag)) current.link = parser.nextText();
}
break;
case XmlPullParser.END_TAG:
if ("item".equals(parser.getName()) && current != null) {
items.add(current);
current = null;
}
break;
}
eventType = parser.next(); // 關鍵:主動拉取下一事件
}
return items;
}
android.content.res.Xml (資源文件) 或 XmlPullParserFactory: 經過深度優化,避免第三方庫開銷。StringBuilder、對象池,減少 GC。break,無需讀完整個文件(Pull 獨有優勢)。IntentService、WorkManager 或 RxJava/Kotlin 協程,避免阻塞主線程導致 ANR。總結:Android 解析本地大 XML,**首選 Pull 解析器**,配合異步執行、對象復用、按需停止,實現高性能低內存目標。