1. 程式人生 > >Android實戰--天氣預報(API+JSON解析)

Android實戰--天氣預報(API+JSON解析)

      學習安卓有一段時間了,應該提高自己的實戰能力,做一些簡單的Demo。下面我們介紹一下如何利用網路API實現天氣預報功能,主要涉及到如何利用API獲得網路資料,網路資料返回一般是JSON格式,這裡又涉及到JSON的解析問題,這些都是比較基礎的問題,應該予以掌握。

介面地址:http://apistore.baidu.com/microservice/weather

請求方法:GET

請求引數:
引數名 型別 必填 引數位置 描述 預設值
citypinyin string urlParam 城市拼音 beijing
請求示例:
http://apistore.baidu.com/microservice/weather?citypinyin=beijing
JSON返回示例:
{
errNum: 0,
errMsg: "success",
retData: {
   city: "北京", //城市
   pinyin: "beijing", //城市拼音
   citycode: "101010100",  //城市編碼	
   date: "15-02-11", //日期
   time: "11:00", //釋出時間
   postCode: "100000", //郵編
   longitude: 116.391, //經度
   latitude: 39.904, //維度
   altitude: "33", //海拔	
   weather: "晴",  //天氣情況
   temp: "10", //氣溫
   l_tmp: "-4", //最低氣溫
   h_tmp: "10", //最高氣溫
   WD: "無持續風向",	 //風向
   WS: "微風(<10m/h)", //風力
   sunrise: "07:12", //日出時間
   sunset: "17:44" //日落時間
  }    
}

下面搞一下佈局檔案:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:minHeight="30dp"
        android:text="天氣預報"
        android:textSize="26dp" />

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:minHeight="30dp"
        android:orientation="horizontal" >

        <EditText
            android:id="@+id/myedit"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1111" />

        <Button
            android:id="@+id/searchweather"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="查詢天氣 " />
    </LinearLayout>

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:minHeight="30dp"
        android:orientation="horizontal" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="城市:" />

        <TextView
            android:id="@+id/city"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:minHeight="30dp"
        android:orientation="horizontal" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="天氣:" />

        <TextView
            android:id="@+id/weather"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:minHeight="30dp"
        android:orientation="horizontal" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="實時氣溫:" />

        <TextView
            android:id="@+id/temp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:minHeight="30dp"
        android:orientation="horizontal" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="最低氣溫:" />

        <TextView
            android:id="@+id/h_temp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:minHeight="30dp"
        android:orientation="horizontal" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="最高氣溫:" />

        <TextView
            android:id="@+id/l_temp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1" />
    </LinearLayout>

</LinearLayout>


下面連線工具類:

package org.lxh.demo;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class HttpDownloader {

	private URL url = null;

	/**
	 * 根據URL下載檔案,前提是這個檔案當中的內容是文字,函式的返回值就是文本當中的內容 1.建立一個URL物件
	 * 2.通過URL物件,建立一個HttpURLConnection物件 3.得到InputStream 4.從InputStream當中讀取資料
	 * 
	 * @param urlStr
	 * @return
	 */
	public String download(String urlStr) {
		StringBuffer sb = new StringBuffer();
		String line = null;
		BufferedReader buffer = null;
		try {
			url = new URL(urlStr);
			HttpURLConnection urlConn = (HttpURLConnection) url
					.openConnection();
			urlConn.setRequestMethod("GET");
			urlConn.setConnectTimeout(8000);
			urlConn.setReadTimeout(8000);
			buffer = new BufferedReader(new InputStreamReader(
					urlConn.getInputStream()));
			while ((line = buffer.readLine()) != null) {
				sb.append(line);
			}

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				buffer.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return sb.toString();
	}
}


獲取返回字串之後要對此JSON資料進行解析:

package org.lxh.demo;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.json.JSONObject;

public class Util {

	public List<Map<String, Object>> getInformation(String jonString)
			throws Exception {

		JSONObject jsonObject = new JSONObject(jonString);
		JSONObject retData = jsonObject.getJSONObject("retData");
		List<Map<String, Object>> all = new ArrayList<Map<String, Object>>();
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("cityName", retData.optString("city"));
		map.put("weather", retData.optString("weather"));
		map.put("temp", retData.optString("temp"));
		map.put("l_temp", retData.optString("l_tmp"));
		map.put("h_temp", retData.optString("h_tmp"));
		all.add(map);

		return all;

	}

}


下面Activity程式:

package org.lxh.demo;

import java.util.Iterator;
import java.util.List;
import java.util.Map;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class Main extends Activity {
	private EditText citynameEditText;
	private Button searchWeatherButton;
	private TextView citynametTextView;
	private TextView weahterTextView;
	private TextView tempTextView;
	private TextView h_tempTextView;
	private TextView l_tempTextView;
	String jonString;
	ProgressDialog progressDialog;
	private static final int SET = 1;
	@SuppressLint("HandlerLeak")
	private Handler handler = new Handler() {

		@Override
		public void handleMessage(Message msg) {
			switch (msg.what) {
			case SET:
				Util util = new Util();
				try {
					List<Map<String, Object>> all = util
							.getInformation(msg.obj.toString());
					Iterator<Map<String, Object>> iterator = all.iterator();
					while (iterator.hasNext()) {
						Map<String, Object> map = iterator.next();
						Log.d("天氣", map.get("weather").toString());
						citynametTextView.setText(map.get("cityName")
								.toString());
						weahterTextView.setText(map.get("weather").toString());
						tempTextView.setText(map.get("temp").toString());
						h_tempTextView.setText(map.get("l_temp").toString());
						l_tempTextView.setText(map.get("h_temp").toString());

					}
					

				} catch (Exception e) {
					e.printStackTrace();
				} finally {

				}
				break;

			}

		}

	};

	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState); // 生命週期方法
		super.setContentView(R.layout.main); // 設定要使用的佈局管理器
		citynameEditText = (EditText) findViewById(R.id.myedit);
		searchWeatherButton = (Button) findViewById(R.id.searchweather);
		citynametTextView = (TextView) findViewById(R.id.city);
		weahterTextView = (TextView) findViewById(R.id.weather);
		tempTextView = (TextView) findViewById(R.id.temp);
		h_tempTextView = (TextView) findViewById(R.id.h_temp);
		l_tempTextView = (TextView) findViewById(R.id.l_temp);
		
		
		
		searchWeatherButton.setOnClickListener(new OnClickListener() {
			
			public void onClick(View v) {
				new Thread(new NewThread()).start();
				Log.d("按鍵", "Success");
				
				
			}
		});
	}

	private class NewThread implements Runnable {

		public void run() {
			
			String address = "http://apistore.baidu.com/microservice/weather?citypinyin="
					+ citynameEditText.getText().toString();

			HttpDownloader httpDownloader = new HttpDownloader();
			String jonString = httpDownloader.download(address);
			Message msg = Main.this.handler
					.obtainMessage(Main.SET, jonString);
			Main.this.handler.sendMessage(msg);

		}

	}

	

}


執行例項效果:

本例子只解析了幾個資料作為例子,如有需要其他資料,可以自行新增,原理相同。發揮你的想象吧!

最後:

歡迎下載,有問題多交流!

相關推薦

Android實戰--天氣預報API+JSON解析

      學習安卓有一段時間了,應該提高自己的實戰能力,做一些簡單的Demo。下面我們介紹一下如何利用網路API實現天氣預報功能,主要涉及到如何利用API獲得網路資料,網路資料返回一般是JSON格式,這裡又涉及到JSON的解析問題,這些都是比較基礎的問題,應該予以掌握。

Android 天氣預報使用okHttp、AsyncTask訪問和風天氣並Gosn解析資料

第一步老規矩導架包,都是開源哦 在專案的配置檔案中新增 compile 'com.squareup.okhttp3:okhttp:3.2.0' compile 'com.squareup.okio:okio:1.9.0' compile 'com.google.code.gs

AJAXjsonp實戰--天氣預報

每天 app callback 數據服務 sele 網絡 請求 sel url   一、案例   本次要做的案例的是使用jsonp制作一個查詢天氣情況的網頁,我會從如何抓取數據接口,到一步一步完成這個案例來詳細講解。   這個頁面樣式非常簡單,截圖如下。用戶需要先選擇一個城

Android:國家氣象局提供的天氣預報介面(完整Json介面)

這裡是我做的一個天氣預報APP:天氣預報原始碼下載 國家氣象局提供的天氣預報介面主要有三個,分別是: http://www.weather.com.cn/data/sk/101010100.html (實時天氣資訊) http://www.weather.com.cn

Android天氣預報APP的實現天氣顯示介面之上下滑動

最近參加了一個小比賽,選了天氣預報APP這個題目,最初選擇它,是想練練網路資料獲取和資料解析方面的知識,後來發現倒是學到了不少介面的東西。下面我來一步步講解一下我是怎麼完成的吧~ 首先,天氣預報最直觀的部分應該就是天氣顯示介面了,這裡,我想做成可以有上下滑動的

新手入門,和風天氣預報免費API介面用GSON工具實現資料解析

作為一個入門不久的安卓小菜鳥,正在做一個個人專案。於是就想要做一個有關天氣的APP,所以到網上找一些免費的介面來獲得一些天氣的資料,找來找去,最後選中了百度API裡面的一個叫和風天氣預報的介面,如下圖,點選開啟連結   沒有預料到的是,我進了一個大大的坑中。和風天氣返回的

GraduateDesign-給APP添加獲取位置信息和天氣預報的功能(json)

當前位置 失敗 rac reader adl country oca import 功能 首先,我的app需要通過網絡來獲取當前所在的位置。這裏我找到了一個json來獲取本地位置信息。 http://int.dpool.sina.com.cn/iplookup/iploo

使用原生JS發送AJAX請求XML,JSON解析

status quest chan ldoc text nbsp 字符 tco send mybutton.addEventListener(‘click‘, (e) => { let request = new XMLHttpRequest() r

基於android天氣預報的設計與實現

目錄 應用開發技術及開發平臺介紹 應用需求分析 應用功能設計及其描述 應用UI展示 ①開發技術:   本系統是採用面向物件的軟體開發方法,基於Android studio開發平臺,以Android作為本系統的開發語言實現音樂播放器預定的需求功能。   ②平臺介紹 硬體平臺

Activiti6.0工作流引擎深度解析實戰已完結雲盤下載

第1章 課程介紹本課程將系統且深入原始碼講解Activiti6.0工作流引擎的使用、配置、核心api以及BPMN2.0規範、資料庫設計及模型對映,Spring Boot2.0整合,工作流平臺搭建、部署與運維等,通過本課程的學習,你將切實學會Activiti6.0工作流引擎

中國天氣網-天氣預報介面api

  中國天氣網地址:http://www.weather.com.cn   請求服務 : 查詢實時天氣資訊 http://www.weather.com.cn/data/sk/101110101.html   在瀏覽器中輸入請求地址,獲得西安的天氣。   其中101110101是城市的程式碼

Android Studio執行錯誤api過時

Android Studio會更新,而有些專案寫的比較久了,所以有時會出現一些錯誤,需要我們手動改下build.gradle檔案中的程式碼 首先說下這次的錯誤: Configuration 'compile' is obsolete and has been replaced with 'i

xmarin.android 城市天氣預報

之所以做這個demo,是為了測試c#中的網路請求是否能在安卓中正確使用 最終效果圖如下 網路請求是在網路上找的程式碼,修復了無參post報錯問題,封裝成一個類庫 程式碼如下: public class HttpHelper { public

天氣預報動態載入js從而才能訪問不同的城市天氣資料啊!

城市的號碼得到了,但是我們需要重新建立一個<script>才能得到該城市的天氣資料,可是script內部又不能重新建立一個新的<script>,如何是好? 百度得到的程式碼修改後如下 var script=new Array(); var head

Android:SQLiteOpenHelper類SQLlite資料庫操作詳細解析

前言 SQLite資料庫操作在Android開發中非常常用 今天我將帶大家全面瞭解關於SQLite資料庫的操作(增、刪、查、改) 目錄 1. SQLite資料庫介紹 SQLite是Android內建的一個小型、關係型、屬

python實現通過微信每天給女友發天氣預報超簡單程式碼+itchat+入門級爬蟲

1.前言        剛學爬蟲想寫個最簡單的小程式體會一下爬蟲的效果,原理程式碼非常簡單,僅供大家學習~2.前期準備    (1).itchat            itchat是一個非常方便簡單的python的微信介面,可以傻瓜一樣的登陸微信,傳送訊息傳送圖片等,這裡我

Android呼叫天氣預報的WebService簡單例子

一、獲取並使用KSOAP包在Android SDK中並沒有提供呼叫WebService的庫,因此,需要使用第三方的SDK來呼叫WebService。PC版本的WebService庫非常豐富,但這些對Android來說過於龐大。適合手機的WebService客戶端的SDK有一些,比較常用的是KSOAP2。我下載

Android開源天氣預報app

LittleFreshWeather 原始碼github地址 注意咯~~ 最新版已適配最新和風天氣介面,可以接著用啦 ^^ 這是一款簡潔的天氣預報app–清新小天氣,它能夠支援國內絕大多數城市,提供包含實時天氣、七天預報、實時氣象資訊及生活

天氣預報介面api

分享一個天氣預報的介面 我用的是和風天氣的介面,這個免費的使用者只能獲取三天的天氣 https://free-api.heweather.com/v5/weather?city=城市&key=你的key值 城市可以是拼音或漢字,key在他的網站註冊的時候會生成一個

[Android] 免費天氣預報接口

get tar 張家界 city 鹽城 .com font true 戶外 [Android] 免費天氣預報接口 這是 國家氣象局提供的天氣預報接口 [免費] 當然,網上有很多的收費API或者每天定次數的接口 使用 國家氣象局 的步驟如下: 1、首先獲取