package com.jerry.earthquake;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.GregorianCalendar;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import android.app.ListFragment;
import android.location.Location;
import android.os.Bundle;
import android.os.Handler;
import android.widget.ArrayAdapter;
public class EarthquakeListFragment extends ListFragment {
//数据集
ArrayList<Quake> earthQuakes = new ArrayList<Quake>();
//adapter
ArrayAdapter<Quake> adapter;
Handler handler = new Handler();
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
//列表项样式
int layoutID = android.R.layout.simple_list_item_1;
//初始化adapter
adapter = new ArrayAdapter<Quake>(getActivity(), layoutID, earthQuakes);
setListAdapter(adapter);
Thread t = new Thread(new Runnable() {
@Override
public void run() {
refreshEarthquakes();
}
});
t.start();
}
private void refreshEarthquakes(){
URL url;
String quakeFeed = getString(R.string.quake_feed);
try {
url = new URL(quakeFeed);
URLConnection connection;
connection = url.openConnection();
HttpURLConnection httpConnection = (HttpURLConnection) connection;
int responseCode = httpConnection.getResponseCode();
if(responseCode == HttpURLConnection.HTTP_OK){
InputStream in = httpConnection.getInputStream();
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
//分析地震源
Document dom = db.parse(in);
Element docEle = dom.getDocumentElement();
//清除旧数据
earthQuakes.clear();
NodeList nl = docEle.getElementsByTagName("entry");
if(nl != null && nl.getLength() > 0){
for(int i = 0;i < nl.getLength() ;i++){
Element entry = (Element) nl.item(i);
Element title = (Element) entry.getElementsByTagName("title").item(0);
Element g = (Element) entry.getElementsByTagName("georss:point").item(0);
Element when = (Element) entry.getElementsByTagName("updated").item(0);
Element link = (Element) entry.getElementsByTagName("link").item(0);
String details = title.getFirstChild().getNodeValue();
String hostname = "http://earthquake.usgs.gov";
String linkAttr = link.getAttribute("href");
String linkString = hostname + linkAttr;
String point;
if(null != g){
point = g.getFirstChild().getNodeValue();
}else{
point = "30.111 28.666";
}
String dt = when.getFirstChild().getNodeValue();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss'Z'");
Date qdate = new GregorianCalendar(0, 0, 0).getTime();
qdate = sdf.parse(dt);
String[] location = point.split(" ");
Location l = new Location("dummyGPS");
l.setLatitude(Double.parseDouble(location[0]));
l.setLongitude(Double.parseDouble(location[1]));
// String magnitudeString = details.split(" ")[1];
// int end = magnitudeString.length() - 1;
// double magnitude = Double.parseDouble(magnitudeString.substring(0,end));
//
// details = details.split(",")[1].trim();
final Quake quake = new Quake(qdate,details,l,3.21,linkString);
//处理一个新发现的地震
handler.post(new Runnable() {
@Override
public void run() {
addNewQuake(quake);
}
});
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
private void addNewQuake(Quake quake) {
//将新地震添加到地震列表中
earthQuakes.add(quake);
//向 ArrayAdapter 通知改变
adapter.notifyDataSetChanged();
}
}
Android DOM 解析
最新推荐文章于 2024-04-20 12:12:57 发布