MainActivity类
package com.example.xmlparsertest;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;
import com.example.xmlparsertest.MyDefaultHandler.MyDefaultHandlerObserver;
import com.example.xmlparsertest.MyDefaultHandler.Person;
import android.os.AsyncTask;
import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.SimpleAdapter;
import android.widget.TextView;
public class MainActivity extends Activity
{
private final static String TAG = "MainActivity";
private ListView mListView = null;
private SimpleAdapter mAdapter = null;
private List> mListViewData = null;
private ProgressBar mProg = null;
private TextView mTextView = null;
private MyAyntask mTask;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findView();
initUI();
mTask = new MyAyntask();
mTask.execute("");
}
private void findView()
{
mListView = (ListView) findViewById(R.id.listView1);
mProg = (ProgressBar) findViewById(R.id.progressBar1);
mTextView = (TextView) findViewById(R.id.textView1);
}
private void initUI()
{
mListViewData = new ArrayList>();
mAdapter = new SimpleAdapter(this, mListViewData, R.layout.listview,
new String[] { "name", "age" }, new int[] { R.id.textView1,
R.id.textView2 });
mListView.setAdapter(mAdapter);
}
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
/**
*
* @author Feishin
* class MyAyntask 子线程解析XML文件,并在UI线程中更新数据
*
*/
class MyAyntask extends AsyncTask implements
MyDefaultHandlerObserver
{
int mTempProgress = 0;//模拟的progeress,测试用
/**
* 子线程
* XML解析
*/
@Override
protected Void doInBackground(String... params)
{
Log.d(TAG, "===========doInBackground=============");
SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
SAXParser saxParser;
InputStream in = null;
try
{
saxParser = saxParserFactory.newSAXParser();
XMLReader xmlReader;
xmlReader = saxParser.getXMLReader();
MyDefaultHandler xmlHandler = new MyDefaultHandler();
xmlHandler.addObserver(this);
xmlReader.setContentHandler(xmlHandler);
in = getAssets().open("person.xml");
xmlReader.parse(new InputSource(in));
} catch (Exception e)
{
e.printStackTrace();
Log.e(TAG, "EXCEPTION ACCOUR");
} finally
{
if (in != null)
{
try
{
in.close();
} catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
return null;
}
/**
* 主线程
* 更新UI。
* 当调用publishProgress时此方法被调用,此方法不能主动调用
*
*/
@Override
protected void onProgressUpdate(Person... values)
{
// TODO Auto-generated method stub
super.onProgressUpdate(values);
Log.d(TAG, "===========onProgressUpdate=============");
Person p = null;
if (values == null)
{
return;
} else
{
p = values[0];
}
mTempProgress = mTempProgress + 10;
HashMap map = new HashMap();
map.put("name", p.getName());
map.put("age", p.getAge());
mListViewData.add(map);
mAdapter.notifyDataSetChanged();
mProg.setProgress(mTempProgress);
}
/**
* 主线程
* 当MyAyntask执行完毕时调用
*/
@Override
protected void onPostExecute(Void result)
{
Log.d(TAG, "===========onPostExecute=============");
super.onPostExecute(result);
mAdapter.notifyDataSetChanged();
mTextView.setText("结束");
mTempProgress = 100;
mProg.setProgress(mTempProgress);
}
/**
* 主线程
* 当MyAyntask准备执行时调用
*/
@Override
protected void onPreExecute()
{
Log.d(TAG, "===========onPreExecute=============");
// TODO Auto-generated method stub
super.onPreExecute();
mTextView.setText(".....Loading.....");
mTempProgress = 0;
mProg.setProgress(mTempProgress);
mListViewData.clear();
}
//MyDefaultHandler类的监听回调
@Override
public void stepUpdate(Person person)
{
// TODO Auto-generated method stub
Log.d(TAG, "===========stepUpdate=============");
MyAyntask.this.publishProgress(person);
}
@Override
public void finished(ArrayList persons)
{
}
}
}
MyDefaultHandler类
package com.example.xmlparsertest;
import java.util.ArrayList;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import android.util.Log;
/**
*
* @author Feishin
* class MyDefaultHandler : XML解析的类
*
*/
public class MyDefaultHandler extends DefaultHandler
{
private final static String TAG = "MyDefaultHandler";
/**
*
* @author Feishin
*
* 自己封装的MyDefaultHandler,主要是为了进度反馈
*
*/
public interface MyDefaultHandlerObserver
{
void stepUpdate(Person person);
void finished(ArrayList persons);
}
private MyDefaultHandlerObserver mObser = null;
public ArrayList persons = null;
private Person person = null;
String elementsTag = null;
public void addObserver(MyDefaultHandlerObserver aMyDefaultHandlerObserver)
{
mObser = aMyDefaultHandlerObserver;
}
/**
* 获取节点的值
*/
@Override
public void characters(char[] ch, int start, int length)
throws SAXException
{
super.characters(ch, start, length);
String value = new String(ch, start, length);
Log.d(TAG, value);
if (person != null && elementsTag != null)
{
if ("age".equalsIgnoreCase(elementsTag))
{
int age = Integer.parseInt(value);
person.setAge(age);
elementsTag = null;
}
if ("name".equalsIgnoreCase(elementsTag))
{
person.setName(value);
elementsTag = null;
}
}
}
/**
* XML全部解析完毕时调用
*
*/
@Override
public void endDocument() throws SAXException
{
// TODO Auto-generated method stub
super.endDocument();
if (mObser != null)
{
mObser.finished(persons);
}
}
/**
* XML开始解析时调用
*
*/
@Override
public void startDocument() throws SAXException
{
// TODO Auto-generated method stub
super.startDocument();
}
/**
* 遇到结束标签时调用
*/
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException
{
super.endElement(uri, localName, qName);
Log.e(TAG, localName);
if (localName.equalsIgnoreCase("person"))
{
persons.add(person);
if (mObser != null)
{
mObser.stepUpdate(person);
try
{
Thread.sleep(2000);
} catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
person = null;
}
}
/**
* 解析元素节点
*/
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException
{
super.startElement(uri, localName, qName, attributes);
Log.i(TAG, localName);
if (localName.equalsIgnoreCase("persons"))
{
if (null == persons)
persons = new ArrayList();
else
persons.clear();
} else if (localName.equalsIgnoreCase("person"))
{
person = new Person();
int id = Integer.parseInt(attributes.getValue("id"));
person.setId(id);
} else if (localName.equalsIgnoreCase("age"))
{
elementsTag = "age";
} else if (localName.equalsIgnoreCase("name"))
{
elementsTag = "name";
}
}
/**
*
* @author Feishin
*
*/
public static class Person
{
private int age;
private String name;
private int id;
public Person()
{
}
public int getAge()
{
return age;
}
public void setAge(int age)
{
this.age = age;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public int getId()
{
return id;
}
public void setId(int id)
{
this.id = id;
}
}
}
代码下载: