1.新建工程项目WeatherForecast。
2.在AndroidManifest文件中添加网络访问相关权限。
XML
<uses-permission android:name="android.permission.INTERNET"/>
3.设计页面布局activity_main.xml,界面效果如图所示。
4.注册高德开放平台,查阅天气查询API文档,通过API文档可以知道要使用该API必须先申请"Web服务 API"密钥(Key),Key将作为HTTP GET请求URL的参数,接收HTTP请求返回的数据为JSON类型数据。文档中也给出了请求URL地址和JSON数据样例。
5.申请"Web服务"API Key。打开高德开放平台的控制台页面,单击左边栏的应用管理→我的应用→创建新应用,如图所示。
在弹出的新建应用窗口中输入应用名称和应用类型,如图所示。
新建应用完成后将出现如图所示界面,此时还需要添加Key才能使用,单击添加Key将弹出如图所示窗口,填写Key名称,勾选Web服务,阅读并同意相关协议,单击提交,即可生成Key。
6.根据JSON样例,生成天气Bean。首先使用计算机上的浏览器测试HTTP GET请求,请求成功将拿到JSON样例。Android Studio中打开菜单File→Settings→Plugins,搜索并安装GsonFormat插件。插件安装完成后,在Java src目录右击New→Java Class,新建WeatherBean.java,在该文件中右击Generate→GsonFormat,在弹出的窗口中将JSON样例粘贴上去,单击OK,即可生成JSON对应的Bean,这里需要将代码中出错的注解删掉。
7.实现MainActivity类的逻辑,MainActivity需要请求并解析数据。首先在build.gradle中添加GSON的依赖,添加完依赖后需要重新sync整个工程。
Groovy
implementation 'com.google.code.gson:gson:2.10.1'
MainActivity类中首先初始化界面控件,找到需要更新的界面控件:
java
textViewProvince = findViewById(R.id.textViewProvince);
textViewCity = findViewById(R.id.textViewCity);
textViewReporttime = findViewById(R.id.textViewReporttime);
textViewTemperature = findViewById(R.id.textViewTemperature);
imageViewWeather = findViewById(R.id.imageViewWeather);
随后开启一个子线程请求并解析数据,子线程中请求数据的代码如下:
java
String path = "https://restapi.amap.com/v3/weather/weatherInfo?city=110101&key=" + URLEncoder.encode(key);
URL url = new URL(path);
//创建 URL对象
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
//设置请求方式
conn.setRequestMethod("GET");
//设置超时时间
conn.setConnectTimeout(5000);
获取数据的代码如下:
java
int responseCode = conn.getResponseCode();
//获取状态码
if (responseCode == 200) {//访问成功
byte[] buffer = new byte[1024];//创建接收缓冲区
InputStream is = conn.getInputStream();//获取服务器的返回流
int len = is.read(buffer);
if (len!=0){
String json1 = new String(buffer,0,len);
}
解析并显示数据的代码如下,使用gson.fromJson()方法解析数据,调用runOnUiThread()更新界面控件:
java
Gson gson =new Gson ();
WeatherBean weatherBean = gson.fromJson(json1,WeatherBean.class);
Log.e("ss",weatherBean.getStatus()+weatherBean.getLives().toString());
if (weatherBean.getStatus().equals("1")){
List<WeatherBean.LivesDTO> lives = weatherBean.getLives();
WeatherBean.LivesDTO livesDTO = lives.get(0);
runOnUiThread(new Runnable() {
@Override
public void run() {
textViewProvince.setText(livesDTO.getProvince());
textViewCity.setText(livesDTO.getCity());
textViewTemperature.setText(livesDTO.getTemperature());
textViewReporttime.setText(livesDTO.getReporttime());
if (livesDTO.getWeather().equals("多云")){
imageViewWeather.setImageResource(R.drawable.baseline_cloud_queue_24);
}else if (livesDTO.getWeather().equals("晴")) {
imageViewWeather.setImageResource(R.drawable.baseline_wb_sunny_24);
}
}
});
高德天气预报Android HTTP