編輯:關於Android編程
首先我們來了解一下SAX解析器的基本知識:
SAX(Simple API for XML)解析器是一種基於事件的解析器,事件驅動的流式解析方式是,從文件的開始順序解析到文檔的結束,不可暫停或倒退。它的核心是事件處理模式,主要是圍繞著事件源以及事件處理器來工作的。當事件源產生事件後,調用事件處理器相應的處理方法,一個事件就可以得到處理。在事件源調用事件處理器中特定方法的時候,還要傳遞給事件處理器相應事件的狀態信息,這樣事件處理器才能夠根據提供的事件信息來決定自己的行為。
SAX的工作原理:簡單地說就是對文檔進行順序掃描,當掃描到文檔(document)開始與結束、元素(element)開始與結束、文檔(document)結束等地方時通知事件處理函數,由事件處理函數做相應動作,然後繼續同樣的掃描,直至文檔結束。
然後我們通過一個小例子來看一下android中我們如何運用SAX去解析XML文件:
(1)首先我們拷貝一個beauties.xml文件到assets目錄下,其內容如下:
范冰冰 28楊冪 23
package com.saxtest; public class Beauty { private String name; private String age; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } @Override public String toString() { return "美女資料 [年齡=" + age + ", 姓名=" + name + "]"; } }
package com.saxtest; import java.util.ArrayList; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class MySaxHandler extends DefaultHandler{ //聲明一個裝載Beauty類型的List private ArrayListmList; //聲明一個Beauty類型的變量 private Beauty beauty; //聲明一個字符串變量 private String content; /** * MySaxHandler的構造方法 * * @param list 裝載返回結果的List對象 */ public MySaxHandler(ArrayList list){ this.mList = list; } /** * 當SAX解析器解析到XML文檔開始時,會調用的方法 */ @Override public void startDocument() throws SAXException { super.startDocument(); } /** * 當SAX解析器解析到XML文檔結束時,會調用的方法 */ @Override public void endDocument() throws SAXException { super.endDocument(); } /** * 當SAX解析器解析到某個屬性值時,會調用的方法 * 其中參數ch記錄了這個屬性值的內容 */ @Override public void characters(char[] ch, int start, int length) throws SAXException { super.characters(ch, start, length); content = new String(ch, start, length); } /** * 當SAX解析器解析到某個元素開始時,會調用的方法 * 其中localName記錄的是元素屬性名 */ @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { super.startElement(uri, localName, qName, attributes); if("beauty".equals(localName)){ beauty = new Beauty(); //新建Beauty對象 } } /** * 當SAX解析器解析到某個元素結束時,會調用的方法 * 其中localName記錄的是元素屬性名 */ @Override public void endElement(String uri, String localName, String qName) throws SAXException { super.endElement(uri, localName, qName); if("name".equals(localName)){ beauty.setName(content); }else if("age".equals(localName)){ beauty.setAge(content); }else if("beauty".equals(localName)){ mList.add(beauty); //將Beauty對象加入到List中 } } }
package com.saxtest; import java.io.InputStream; import java.util.ArrayList; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.InputSource; import org.xml.sax.XMLReader; import android.app.Activity; import android.content.res.AssetManager; import android.os.Bundle; import android.widget.TextView; import com.example.saxtest.R; public class SaxTestActivity extends Activity{ //聲明裝載Beauty對象的List private ArrayListbeautyList; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.saxtest); //初始化beautyList鏈表 if(beautyList == null){ beautyList = new ArrayList (); } doMyMission(); setupViews(); } /** * 使用SAX解析器解析XML文件的方法 */ private void doMyMission(){ try { //獲取AssetManager管理器對象 AssetManager as = this.getAssets(); //通過AssetManager的open方法獲取到beauties.xml文件的輸入流 InputStream is = as.open("beauties.xml"); //通過獲取到的InputStream來得到InputSource實例 InputSource is2 = new InputSource(is); //使用工廠方法初始化SAXParserFactory變量spf SAXParserFactory spf = SAXParserFactory.newInstance(); //通過SAXParserFactory得到SAXParser的實例 SAXParser sp = spf.newSAXParser(); //通過SAXParser得到XMLReader的實例 XMLReader xr = sp.getXMLReader(); //初始化自定義的類MySaxHandler的變量msh,將beautyList傳遞給它,以便裝載數據 MySaxHandler msh = new MySaxHandler(beautyList); //將對象msh傳遞給xr xr.setContentHandler(msh); //調用xr的parse方法解析輸入流 xr.parse(is2); } catch (Exception e) { e.printStackTrace(); } } /** * 將解析結果輸出到界面的方法 */ private void setupViews(){ String result = ""; for (Beauty b : beautyList) { result += b.toString(); } TextView textView = (TextView) findViewById(R.id.textView); textView.setText(result); } }
Android之SAX解析XML
.xml代碼如下: .java代碼如下: package org.lxh.demo; import android.app.
原因分析用戶使用android 5.0以上的系統在安裝APP時,將消息通知的權限關閉掉了。實際上用戶本意只是想關閉Notification,但是Toast的show方法中
先來看下要實現效果圖:查閱資料後,發現網上大部分都是用這種方法實現的:多寫一個和需要懸浮的部分一模一樣的layout,先把浮動區域的可見性設置為gone。當浮動區域滑動到
在進行Android內存洩露分析時,面對成千上萬個對象,你是否藍瘦,香菇?作為測試人員你在進行內存洩露測試之後,是否有勇氣告訴開發同事程序已經沒有內存洩露,可以放心發布了