HttpUrlConnection+JSON应用实例

JSON

JSON是一种轻量级的数据交换格式,有两种数据结构:单条JSON数据和多条JSON数组,其中JSON数组是以一对中括号【】表示,JSON对象是一对花括号{}表示,键-值相对,键必须包裹一对双引号,多个键值对中间用逗号分割。

天气预报实例

思路:运用HttpUrlConnection发送请求,从网络上获取数据(JSON),解析json数据更新UI界面。

效果图展示

HttpUrlConnection+JSON应用实例_第1张图片

HttpUrlConnection+JSON应用实例_第2张图片

代码展示

一、在布局文件中创建出一个EditText,用来输入城市,一个按钮用来查询,三个TextView来显示天气状况。


//在xml布局文件中
 id="@+id/weather_edit"
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:hint="请输入城市名"/>

    

二、1、在Activity中绑定ID和设置监听

2、创建内部类继承AsyncTack,定义三种参数,重写dolnBackground方法和onPostExeccute方法。dolnBackground方法中写关于Http请求的,onPostExeccute方法来解析Json数据。

01、在dolnBackground方法中创建URL对象

02、通过URL对象调用openConnection()方法获得HttpURLConnection对象

03、HttpURLConnection对象设置其他连接属性

04、HttpURLConnection对象调用getInputStream()方法向服务器发送http请求并获取到服务器返回的输入流

05、读取输入流,转换成String字符串


public class WeatherActivity extends AppCompatActivity {

    private EditText cityET;
    private Button button;
    private TextView windTV;
    private TextView tempTV;
    private TextView weatherTV;
    private String API="https://free-api.heweather.com/s6/weather-now?key=f4df0dc926f54557b9c94b6c09451b51&location=";//网站的API接口+key+城市

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_weather);

        bindID();
       //监听
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
             String name  =cityET.getText().toString();
                new MeTask().execute(API+name);//启动
            }
        });
    }

    private void bindID() {
        cityET=findViewById(R.id.weather_edit);
        button=findViewById(R.id.weather_btn);
        windTV=findViewById(R.id.weather_text1);
        tempTV=findViewById(R.id.weather_text2);
        weatherTV=findViewById(R.id.weather_text3);
    }
//内部类继承AsyncTack
    class MeTask extends AsyncTask{
//进行耗时操作
        @Override
        protected String doInBackground(String... strings) {

//获取Http请求
            StringBuffer stringBuffer=new StringBuffer();
            try {
            //创建URL——找到网站源
                URL url=new URL(strings[0]);
                //URL对象调用openConnection()方法
                HttpURLConnection connection= (HttpURLConnection) url.openConnection();
                 //创建数据流——Inputstream,并且判断网络
                InputStream inputStream=null;
                if (connection.getResponseCode()==200){
                    inputStream=connection.getInputStream();//只有网络正常且返回数据正常时,我们才能创建
                }else {
                    return "fail";//网络异常
                }
                //创建放数据的地方
                InputStreamReader reader=new InputStreamReader(inputStream);
                //获取数据
                BufferedReader bufferedReader=new BufferedReader(reader);
                String temp="";
                while ((temp=bufferedReader.readLine())!=null){
                    stringBuffer.append(temp);
                }
                inputStream.close();
                reader.close();
                bufferedReader.close();

            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return stringBuffer.toString();//返回的是JSON数据
        }
//耗时操作后,更新UI
        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
         //解析JSON数据
            try {
                JSONObject object=new JSONObject(s);
                //解析Json数组
                JSONArray array=object.getJSONArray("HeWeather6");
                JSONObject object1=array.getJSONObject(0);
                JSONObject object2=object1.getJSONObject("now");
                String temp=object2.getString("tmp");       
         Stringwind=object2.getString("wind_dir")+object2.getString("wind_sc");
                String weather=object2.getString("cond_txt");

                weatherTV.setText("天气:"+weather);
                windTV.setText("风向-风力:"+wind);
                tempTV.setText("温度:"+temp);

            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    }
}

你可能感兴趣的:(HttpUrlConnection+JSON应用实例)