学习安卓有一段时间了,应该提高自己的实战能力,做一些简单的Demo。下面我们介绍一下如何利用网络API实现天气预报功能,主要涉及到如何利用API获得网络数据,网络数据返回一般是JSON格式,这里又涉及到JSON的解析问题,这些都是比较基础的问题,应该予以掌握。
首先在http://apistore.baidu.com/?qq-pf-to=pcqq.c2c找到你想要的API,这里我们选择http://apistore.baidu.com/astore/serviceinfo/1798.html,网页里有关于API的介绍:
接口地址: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解析)
- }
运行实例效果:
相关推荐
在Android项目开发实战中,构建一个天气应用是一个常见的任务,这不仅能够提升开发者对Android平台的理解,还能实际解决用户日常需求。"ANDROID项目开发实战:天气"是一个专注于使用Android技术来实现天气查询和空气...
《Android实战:构建热点新闻应用》 在移动互联网飞速发展的今天,开发一款能够实时更新、展示热点新闻的应用成为许多开发者和技术爱好者的目标。本项目旨在介绍如何使用Android平台结合Python后端来创建一个功能...
本文将深入探讨如何在Android环境中创建一个实用的天气预报应用程序,结合"安卓平台应用开发实战-天气预报"这一主题,我们将关注以下几个核心知识点: 1. **Android Studio与环境搭建**:Android Studio是Google...
【Android天气预报源码解析】 本压缩包包含的“安卓Android源码——天气预报源码.zip”是一个完整的Android应用程序项目,旨在实现天气预报功能。这个项目对于学习Android应用开发,尤其是涉及网络请求、数据解析、...
一、Android JSON解析库 Android SDK本身提供了`org.json`包,包含`JSONObject`和`JSONArray`类,可以用于基础的JSON解析。除此之外,还有许多第三方库,如Gson、Jackson、Fastjson和Square的OkHttp与Retrofit,它们...
在Android平台上实现一个天气预报应用是一项常见的开发任务,它涉及到网络请求、数据解析、UI设计等多个方面的技术。本文将深入探讨如何基于Android系统构建一个简单的天气预报实例。 首先,我们需要理解Android...
综上所述,实现“Android天气预报”涉及的主要知识点包括Android Widget的创建和更新机制、网络请求、数据解析、UI设计以及权限管理。在开发过程中,需要考虑用户体验和性能优化,确保Widget能够稳定、高效地为用户...
HttpURLConnection是Android SDK自带的API,虽然相对低级,但性能较好且易于控制;HttpClient在早期版本的Android中被广泛使用,但在新版本中已被弃用。OkHttp和Volley则是更现代的选择,它们提供了更高级别的抽象,...
【Android天气预报源码】是一个开放的学习资源,它包含了...总之,这个【Android天气预报源码】是一个全面的实战教程,适合初学者和有一定基础的开发者参考和学习,通过实际操作和调试,能有效地提升Android开发技能。
这个"android实战DeMo--英文词典"项目显然就是这样一个实例,它结合了Android平台、网络请求库Volley以及数据解析库Gson的核心功能。让我们详细探讨一下这些关键知识点。 首先,Android是Google推出的一种开源移动...
综上所述,这个Android天气预报Demo源码涵盖了网络请求、多线程通信、JSON解析和UI设计等核心知识点,是学习Android开发实战技能的一个良好实践案例。通过分析和理解源码,开发者不仅可以提升自己的编程技巧,还能...
总结来说,实现"Android项目实战--手机卫士18--读取用户的短信内容以及短信备份"涉及到的关键技术包括: 1. 请求`READ_SMS`权限。 2. 使用`ContentResolver`查询短信内容。 3. 检查权限并在必要时请求运行时权限。 4...
3. **JSON解析**:从API获取的天气数据是以JSON格式返回的,需要使用Gson、Jackson或Android自带的Gson库将JSON转换为Java对象,以便于处理和显示。 4. **异步处理**:为了防止因网络操作阻塞UI线程,需要使用...
总的来说,"基于Android的天气预报实现"项目涵盖了许多Android开发的实战技能,包括但不限于:Android SDK的使用、Java编程、网络编程、数据解析、UI设计和文档编写。通过这个项目,开发者可以全面提高自己的移动...
同时,JSON解析库如Gson或Jackson会被用来将接收到的JSON数据转换成Java对象。 6. **Android权限管理** - 在Android 6.0及以上版本,部分敏感权限需要在运行时动态申请。KamiWeather可能使用` ActivityCompat`和`...
本示例项目"Android天气预报例子从weather.com.cn读取"就是一个典型的实战案例,它以聊城市为例,展示了如何从weather.com.cn获取天气数据,并通过解析JSON数据来展示天气信息。下面我们将详细探讨这个项目中的关键...
在Android开发领域,创建一个天气预报应用是一项常见的实践任务,它涉及到多个技术点,包括网络请求、数据解析、UI设计以及地理位置服务等。本项目"Android天气预报源代码"就是一个典型的示例,它实现了自动定位功能...
这篇详尽的文章将深入探讨如何使用Android开发一个具备天气预报功能的应用程序,主要基于提供的"期末大作业基于android的天气预报app系统源码(拥有查看天气-城市管理等功能).zip"资源。这个应用集成了查看天气状况和...
这通常涉及读取`Cursor`,解析出每条短信的数据,然后将其序列化为JSON或其他格式存储。 4. **恢复短信**:当需要恢复短信时,读取备份的短信数据,然后使用`ContentResolver`的`insert()`方法将每条短信插入到`sms...
2. **Gson库**:Google提供的Gson库是Android中常用的JSON解析库,它可以将Java对象转换为JSON字符串,反之亦然。使用Gson,可以方便地将JSON数据映射到Java对象,简化解析过程。 3. **Jackson库**:另一个流行的...