使用HttpURLConnection和JSON天气预报

本文介绍了在Android开发中如何利用HttpURLConnection请求JSON数据以获取天气预报。首先讲解了JSON的定义和应用,然后详细阐述了请求API、处理网络数据、解析JSON以及使用AsyncTask异步操作的步骤,展示了如何从服务器获取并解析天气信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先什么是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);
                                         }
                                     }

这就是关于天气预报的代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值