Android

您所在的位置:网站首页 地震监测报告 Android

Android

2024-07-06 11:39:41| 来源: 网络整理| 查看: 265

Earthquake(地震显示器) 项目 详解

本文地址: http://blog.csdn.net/caroline_wendy/article/details/21976997

本文的合集已经编著成书,《高级Android开发强化实战》,欢迎各位读友的建议和指导。

在京东即可购买:https://item.jd.com/12385680.html

环境: Android Studio 0.5.2, Gradle 1.11, kindle fire

时间: 2014-3-24

修正位置信息异常: http://blog.csdn.net/caroline_wendy/article/details/24465487

Earthquake项目, 主要是读取USGS(United States Geological Survey, 美国地址勘探局)提供的feeds(订阅源), 进行显示数据;

需要读取互联网的数据, 进行格式解析(parse), 数据类型是atom类型, 类似XML.

订阅源地址: http://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/2.5_day.atom

格式:

USGS Magnitude 2.5+ Earthquakes, Past Day 2014-03-24T07:56:39Z U.S. Geological Survey http://earthquake.usgs.gov/ http://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/2.5_day.atom http://earthquake.usgs.gov/favicon.ico urn:earthquake-usgs-gov:ci:15479569 M 2.9 - 9km W of Alberto Oviedo Mota, Mexico 2014-03-24T07:48:34.609Z DYFI? - I

Time2014-03-24 07:38:10 UTC2014-03-23 23:38:10 -08:00 at epicenterLocation32.222°N 115.274°WDepth14.10 km (8.76 mi) ]]> 32.2215 -115.274 -14100 ...... ...... Earthquake的具体设计:

新建项目: Earthquake

1. 新建Quake(Quake.java)类, 显示地震数据.

位置: java->package->Quake

package mzx.spike.earthquake.app; import android.location.Location; import java.text.SimpleDateFormat; import java.util.Date; public class Quake { private Date date; private String details; private Location location; private double magnitude; private String link; public Date getDate() { return date; } public String getDetails() { return details; } public Location getLocation() { return location; } public double getMagnitude() { return magnitude; } public String getLink() { return link; } public Quake(Date _d, String _det, Location _loc, double _mag, String _link) { date = _d; details = _det; location = _loc; magnitude = _mag; link = _link; } @Override public String toString() { SimpleDateFormat sdf = new SimpleDateFormat("HH.mm"); String dateString = sdf.format(date); return dateString + ": " + magnitude + " " + details; } } 详解:

1. 显示的类型: date, 日期; details, 详细信息, 地点; location, 位置; magnitude, 震级; link, 链接;

2. get()方法, 返回信息; 构造函数, 赋初值; toString(), 默认输出信息;

2. 修改activity_main.xml, 添加fragment.

位置: res->layout->activity_main.xml

添加Fragment, 指定实现(.java)文件位置.

3. 新建EarthquakeListFragment.java

位置: java->package->EarthquakeListFragment.java

package mzx.spike.earthquake.app; import android.app.ListFragment; import android.location.Location; import android.os.Bundle; import android.os.Handler; import android.util.Log; import android.widget.ArrayAdapter; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; import java.text.ParseException; 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 javax.xml.parsers.ParserConfigurationException; public class EarthquakeListFragment extends ListFragment { ArrayAdapter aa; ArrayList earthquakes = new ArrayList(); @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); int layoutID = android.R.layout.simple_list_item_1; aa = new ArrayAdapter(getActivity(), layoutID , earthquakes); setListAdapter(aa); Thread t = new Thread(new Runnable() { @Override public void run() { refreshEarthquakes(); } }); t.start(); } private static final String TAG = "EARTHQUAKE"; private Handler handler = new Handler(); private void refreshEarthquakes() { // Get the XML URL url; try { String quakeFeed = getString(R.string.quake_feed); 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(); // Parse the earthquake feed. Document dom = db.parse(in); Element docEle = dom.getDocumentElement(); // Clear the old earthquakes earthquakes.clear(); // Get a list of each earthquake entry. 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 linkString = hostname + link.getAttribute("href"); String point = g.getFirstChild().getNodeValue(); String dt = when.getFirstChild().getNodeValue(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss.SSS'Z'"); Date qdate = new GregorianCalendar(0,0,0).getTime(); try { qdate = sdf.parse(dt); } catch (ParseException e) { Log.d(TAG, "Date parsing exception.", e); } 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(); //修改                         //details = details.split(",")[1].trim(); final Quake quake = new Quake(qdate, details, l, magnitude, linkString); // Process a newly found earthquake handler.post(new Runnable() { @Override public void run() { addNewQuake(quake); } }); } } } } catch (MalformedURLException e) { Log.d(TAG, "MalformedURLException", e); } catch (IOException e) { Log.d(TAG, "IOException", e); } catch (ParserConfigurationException e) { Log.d(TAG, "Parser Configuration Exception", e); } catch (SAXException e) { Log.d(TAG, "SAX Exception", e); } finally { } } private void addNewQuake(Quake _quake) { // Add the new quake to our list of earthquakes. earthquakes.add(_quake); // Notify the array adapter of a change. aa.notifyDataSetChanged(); } } 详解:

1. 重写onActivityCreated()方法, 绑定适配器, 在线程(thread)中刷新地震信息(refreshEarthquakes);

2. 刷新地震信息refreshEarthquakes()方法, 根据订阅源(feed), 创建HTTP链接;

3. 解析文档(parse), 清空数据(clear);

4. 解析atom格式的标签, 根据标签属性, 输出相应的信息;

5. 实例化(new)Quake类, 在handler(句柄)中, 运行添加地震信息的方法(addNewQuake);

6. 注意链接需要相应的异常捕获(catch)方式, 否则报错;

7. 网络调用(network call)在主Activity调用, 会报错, 需要在线程,后台(asynctask)运行;

8. Handler会产生歧义, 注意使用Android的相应类, 不是java的, 否则无法实例化(initialized)

9. 日期格式(SimpleDateFormat)解析, 需要匹配相应的字符串, 否则抛出异常, 无法解析(parse);

10 添加新的地震信息(addNewQuake), 通知适配器(notifyDataSetChanged), 进行改变.

4. 修改strings信息

位置: res->values->strings

Earthquake Hello world! Settings http://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/2.5_day.atom 添加相应的订阅源(feeds).

5. 修改AndroidManifest.xml

位置: root->AndroidManifest.xml

提供网络访问权限(permission), .

6. 运行程序.

下载地址: http://download.csdn.net/detail/u012515223/7091879



【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭