您的位置:首页 > 理论基础 > 计算机网络

使用HttpURLConnection和JSON天气预报

2018-03-15 21:09 274 查看
首先什么是JSON我们来了解一下

JSON是一种轻量级的数据交换格式。

JSON数据格式应用非常广泛,在APP的开发中,大多数服务端返回的接口数据都是采用JSON数据格式。

对于数据传输的结构

首先从客户端发送请求然后服务端接受之后服务端返回数据给客户端

在传递的过程中传递的是数据,在实际的开发过程当中,服务端传递的是JSON的数据。

JSON有自己行业的标准,所有的开发者都要遵循着一个标准。

JSON分为两种数据结构

一种是单条JSON在安卓中称为JSONObject

多条JSON在安卓中称为JSONArray

注意 在实例化JSONObject的会抛出JSONException异常需要使用try catch处理。

在实现天气预报的前提下我们首先要注册请求URL的API这个需要我们去注册一个账号然后就提起API之后在链接后面将parameters去掉之后加now加?输入key和=之后一串数字自己可以在上面获得之后使用&再加一个location就可以就像下面的一样至于为啥没有城市这个是我们自己要输入的城市来获取天气情况

private String weatherAPI = "https://free-api.heweather.com/s6/weather/now?key=06b1906fb33e4055a26e11556227744c&location=";


之后我们就要使用API我们为了方便我们就要使用AsyncTask方法从网上获取我们需要的数据

class MyastncTask extends AsyncTask<String, String, String> {
StringBuffer stringBuffer = new StringBuffer();

@Override
protected String doInBackground(String... strings) {
try {
//创建URL
URL url = new URL(strings[0]);

HttpURLConnection connection = (HttpURLConnection) url.openConnection();

InputStream inputStream = null;

if ((connection.getResponseCode() == 200)) {
inputStream = connection.getInputStream();
//只有网络正常我们才能创建输入流。
} else {
return "unwork";
}

InputStreamReader reader = new InputStreamReader(inputStream);
//创建输入流读取对象
BufferedReader bufferedReader = new BufferedReader(reader);
//输入流缓存读取

String temp = "";

while ((temp = bufferedReader.readLine()) != null) {
////输入流转换成String
stringBuffer.append(temp);
}
bufferedReader.close();
reader.close();
inputStream.close();

} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

return stringBuffer.toString();
}


在上面的代码中我们要注意 BufferedReader bufferedReader = new BufferedReader(reader);

这个就是设置一个中转站吧下载的数据储存在一个地方然后一起一个片段一个片段的传递到需要的地方这样就会节约更多的资源办更多的事情,提升我们的效率。

这个之前我们首先要判断网络是否有用因为有用之后才能下载字节码

将这个网上的JSON数据下载下来然后我们就要对这个进行解析这个时候我们就要用到下面的代码段

protected void onPostExecute(String s) {
super.onPostExecute(s);
if (s.equals("unwork")) {
Toast.makeText(WeatherActivity.this, "网络有问题", Toast.LENGTH_SHORT).show();
}
else {
try {
JSONObject object = new JSONObject(s);
JSONArray array = object.getJSONArray("HeWeather6");
JSONObject object1 = array.getJSONObject(0);
JSONObject newObj = object1.getJSONObject("now");
String weather = newObj.getString("cond_txt");
String wind = newObj.getString("wind_dir")+newObj.getString("wind_sc")+"级";
String temperature = newObj.getString("tmp");
weatherTV.setText(weather);
windTV.setText(wind);
tempTV.setText(temperature);
} catch (JSONException e) {
e.printStackTrace();
}
}
}


如果没有网络我们就要把这个结果反馈给使用者然后检查网络之后我们就将JSON解析

因为一开始的HeWeather6是单条数据JSON所以使用JSONObject之后他包含了多个JSON所以之后我们使用JSONArray创建对象之后再最后使用JSONObject调用吧数据提取出来

最后我们要启动线程

searchBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String city = cityET.getText().toString();
new MyastncTask().execute(weatherAPI + city);

9647
}
}


这就是关于天气预报的代码
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: