天气预报总结
一、设置上网权限
在AndroidManifest.xml的<manifest …>…< /manifest>中添加如下内容:
<manifest ...>
...
<!--添加上网权限-->
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
</manifest>
二、异步线程,以便及时更新天气信息
在相应的Activity的onCreate()中添加
/*0.开启一个异步线程,以便实时更新天气*/
ReadJsonTask mytask=new ReadJsonTask();
mytask.execute();
/*1.获取天气数据*/
//(1)获取JSON格式数据
//(2)建立实体数据模型,以解析JSON格式
/*2.将数据显示到控件上*/
//(1)数据显示
//(2)网络图片资源显示
//注:模板示例,无具体实现
//异步任务线程类
class ReadJsonTask extends AsyncTask{
/*protected void onPreExecute(){
super.onPreExecute();
//在execute()调用后立即执行,一般用于设置任务前的准备
}*/
@Override
protected Object doInBackground(Object[] params) {
//在onPreExecute()后执行,用于较费时的操作
//不能在该函数中更新UI组件
/*1.获取UI线程中的信息*/
result = null;
return result;
}
/*protected void onProgressUpdate(Object[] values){
//与publishProgress()配合使用,用于实时更新UI组件(如进度条)
super.onProgressUpdate();
}*/
@Override
protected void onPostExecute(Object result) {
super.onPostExecute(result);
//后台任务结束时调用,result为doInBackground()的返回值
/*2.根据信息查询相应的天气信息*/
/*3.将天气信息更新到UI线程中*/
}
}
三、彩云天气API说明
1.注册账号,获得令牌值token
请先至彩云开放平台注册,注册后可以获得 token 。
把您的 token 拼到 API 请求的 URL 中,如
https://api.caiyunapp.com/v2.5/TAkhjf8d1nlSlspN/121.6544,25.1552/weather.json
(格式:https://api.caiyunapp.com/v2.5/令牌值/城市经纬度/weather.json)
其中 TAkhjf8d1nlSlspN 就是一个共用测试 token 。不要把私有token 告诉任何人!
.2.API使用
示例如下:
// 第一个为获取城市的经纬度location":{"lat":23.081746,"lng":112.451073},
// 第二个为利用经纬度获取天气数据"realtime":{"status":"ok","temperature":29.0,"humidity":0.76,"cloudrate":0.3,"skycon":"PARTLY_CLOUDY_DAY",
// https://api.caiyunapp.com/v2/place?token={令牌值}&lang=zh_CN&query=肇庆
// https://api.caiyunapp.com/v2.5/令牌值/112.451073,23.081746/realtime
提示:将网址直接输入到浏览器搜索栏,你获得的JSON数据,可能会看到的是保留转义,如下
{
"id":"B0FFJ1X4TX","name":"\u8087\u5e86\u7ad9",
"formatted_address":"\u4e2d\u56fd \u5e7f\u4e1c\u7701 \u8087\u5e86\u5e02 \u7aef\u5dde\u533a",
"location":{"lat":23.081746,"lng":112.451073},
"place_id":"a-B0FFJ1X4TX"
}
简单的解决方法:利用JSON在线解析(如:https://www.json.cn/)查看,选择取消保留转义
四、代码获取JSON数据
这里用的是volley框架,记得在项目中放入volley框架包(建议上百度查相关博客)
private RequestQueue requestQueue;
//volley框架,RequestQueue初始化
requestQueue= Volley.newRequestQueue(this);
//JSONLocationUrl="https://api.caiyunapp.com/v2/place?token={qwUMf5KJvTRtyInn}&lang=zh_CN&query=肇庆";
JsonObjectRequest jsonObjectRequest1 = new JsonObjectRequest(
Request.Method.GET,//方式
JSONLocationUrl,//网址
null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
Log.e("===",response.toString());
try {
//获取城市经纬度location.optString("lat"),location.optString("lng")
location=response.getJSONArray("places").getJSONObject(0).getJSONObject("location");
Log.e("===",location.toString());
} catch (JSONException e) {
e.printStackTrace();
}
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError arg0) {
}
});
/*
*/
requestQueue.add(jsonObjectRequest1);
//运行结果为 Android中调试 中的第一张图
Android中调试
!! 善用Log.e()
//JSONObject response
Log.e("===",response.toString());
//运行结果以及查看的方法如下:(一般在以下两个位置能找到)
Android中JSON解析以及使用
{
"status":"ok",
"api_version":"v2.5",
"api_status":"active",
"lang":"zh_CN",
"unit":"metric",
"tzshift":28800,
"timezone":"Asia/Shanghai",
"server_time":1654156762,
"location":[
23.081746,
112.451073
],
"result":{
"realtime":{
"status":"ok",
"temperature":32,
"humidity":0.71,
"cloudrate":0.3,
"skycon":"PARTLY_CLOUDY_DAY",
"visibility":30,
"dswrf":444.4,
"wind":{
"speed":19.01,
"direction":168
},
"pressure":98987.64,
"apparent_temperature":33.9,
"precipitation":{
"local":{
"status":"ok",
"datasource":"radar",
"intensity":0
},
"nearest":{
"status":"ok",
"distance":5.53,
"intensity":0.1875
}
},
"air_quality":{
"pm25":15,
"pm10":25,
"o3":76,
"so2":9,
"no2":3,
"co":0.6,
"aqi":{
"chn":26,
"usa":57
},
"description":{
"chn":"优",
"usa":"良"
}
},
"life_index":{
"ultraviolet":{
"index":5,
"desc":"中等"
},
"comfort":{
"index":0,
"desc":"闷热"
}
}
},
"primary":0
}
}
/*翻译如下
{
"status": "ok",
"api_version":"v2.5",
"api_status": "active",
"lang": "zh_CN",
"单位": "公制",
"tzshift":28800,
"时区": "亚洲/上海"。
"server_time":1654156762,
"位置":[
23.081746,
112.451073
],
"结果":{
"实时":{
"状态": "OK"。
"温度":32,
"湿度":0.71,
"cloudrate":0.3,
"skycon": "PARTLY_CLOUDY_DAY",
"能见度":30。
"dswrf":444.4。
"风":{
"速度":19.01,
"方向":168
},
"压力":98987.64,
"表观温度":33.9,
"降水":{
"本地":{
"status": "ok",
"数据源": "雷达",
"强度":0
},
"最近的":{
"状态": "OK",
"距离":5.53。
"强度":0.1875
}
},
"空气质量":{
"pm25":15,
"pm10":25,
"o3":76,
"so2":9,
"no2":3,
"co":0.6。
"aqi":{
"CHN":26,
"美国":57
},
"描述":{
"CHN": "优"。
"美国": "良"
}
},
"生命指数":{
"紫外线":{
"index":5,
"desc": "中等"
},
"舒适度":{
"index":0,
"desc": "闷热"
}
}
},
"主要":0
}
}
*/
善用github或码云!
在github或码云上能找到一些Android天气预报的项目作为参考
Android Studio导入项目的正确姿势
路径里含有中文,可能导致导入出错或无法识别
1.打开Android Studio软件,在软件的左上角我们找到file按钮,然后选择里面的Open…
2.然后我们在打开的窗口里面浏览到我们的项目,最好能够选择里面的build.gradle文件,然后点击ok,选择开启新窗口
3.再然后会弹出窗口,询问是否信任项目,选择信任后等待一段时间即可加载出完整的项目