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
{ 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
AJAX(七)jsonp實戰--天氣預報
每天 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、首先獲取