Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android - Earthquake(地震顯示器) 項目 詳解

Android - Earthquake(地震顯示器) 項目 詳解

編輯:關於Android編程

Earthquake(地震顯示器) 項目 詳解

 

 

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

時間: 2014-3-24

 

Earthquake項目, 主要是讀取USGS(United States Geological Survey, 美國地址勘探局)提供的feeds(訂閱源), 進行顯示數據;

需要讀取互聯網的數據, 進行格式解析(parse), 數據類型是atom類型, 類似XML.

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

格式:

 


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
2014-03-24T07:48:34.609Z

DYFI? - I

 

Time
2014-03-24 07:38:10 UTC
2014-03-23 23:38:10 -08:00 at epicenter
Location
32.222°N 115.274°W
Depth
14.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();

                        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

 


\

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved