Android 使用Volly解析JSON数据获取天气预报

概述

以及郭霖的Volly基本用法: http://blog.csdn.net/guolin_blog/article/details/17482095
利用已知的Url获取JSON数据,然后解析得到我们需要的数据。
效果图:

一。数据来源

     http://wthrcdn.etouch.cn/weather_mini?city=北京
   通过城市名字获得天气数据,json数据
   http://wthrcdn.etouch.cn/weather_mini?citykey=101010100
   通过城市id获得天气数据,json数据

使用Volly框架获取数据

 RequestQueue requestQueue= Volley.newRequestQueue(this);
        JsonObjectRequest stringRequest=new JsonObjectRequest("http://wthrcdn.etouch.cn/weather_mini?city="+cityname,null,
                new Response.Listener<JSONObject>(){
                    @Override
                    public void onResponse(JSONObject jsonObject) {
                        show(jsonObject);//进一步解析JSON数据的封装方法
                    }
                },new Response.ErrorListener(){

            @Override
            public void onErrorResponse(VolleyError volleyError) {
            }
        }){
            @Override
            protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {
                JSONObject jsonObject;
                try {
                    jsonObject=new JSONObject(new String(response.data,"UTF-8"));
                    return Response.success(jsonObject, HttpHeaderParser.parseCacheHeaders(response));
                } catch (JSONException e) {
                    e.printStackTrace();
                    return Response.error(new ParseError(e));
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                    return Response.error(new ParseError(e));
                }
            }
        };
        requestQueue.add(stringRequest);
得到的数据是这样的

{"desc":"OK","status":1000,"data":{"wendu":"-2","ganmao":"天气转凉,空气湿度较大,较易发生感冒,体质较弱的朋友请注意适当防护。","forecast":[{"fengxiang":"北风","fengli":"微风级","high":"高温 6℃","type":"霾","low":"低温 -5℃","date":"4日星期三"},{"fengxiang":"北风","fengli":"微风级","high":"高温 2℃","type":"霾","low":"低温 -5℃","date":"5日星期四"},{"fengxiang":"南风","fengli":"微风级","high":"高温 4℃","type":"霾","low":"低温 -1℃","date":"6日星期五"},{"fengxiang":"南风","fengli":"微风级","high":"高温 1℃","type":"小雪","low":"低温 -4℃","date":"7日星期六"},{"fengxiang":"南风","fengli":"微风级","high":"高温 2℃","type":"阴","low":"低温 -5℃","date":"8日星期天"}],"yesterday":{"fl":"微风","fx":"南风","high":"高温 5℃","type":"霾","low":"低温 -5℃","date":"3日星期二"},"aqi":"419","city":"北京"}}
我的解析办法(具体解析说明请参考我的上一篇文章 点击打开链接

    private void show(JSONObject jsonObject) {
        try {
            JSONObject data=jsonObject.getJSONObject("data");//获取data详情
            JSONArray forecast=data.getJSONArray("forecast");//获取天气预报七天数组
            JSONObject today=forecast.getJSONObject(0);//获取今天的天气详情
            String wendu=data.getString("wendu");
            String fengxiang=today.getString("fengxiang");
            String fengli=today.getString("fengli");
            String high=today.getString("high");
            String low=today.getString("low");
            String type=today.getString("type");
            String date=today.getString("date");
            tv_show.setText("温度:"+wendu+"°\n" +
                    "风向:"+fengxiang+"\n" +
                    "风力:"+fengli+"\n" +
                    "最高温度:"+high+"\n" +
                    "最低温度:"+low+"\n" +
                    "天气:"+type+"\n" +
                    "日期:"+date);
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

整体代码

public class MainActivity extends Activity {
    long exitTime=0;
    private EditText edt_city;
    private TextView tv_show;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv_show= (TextView) findViewById(R.id.textView);
        edt_city= (EditText) findViewById(R.id.edt_city);
        //回车点击事件
        edt_city.setOnKeyListener(new View.OnKeyListener() {
            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                if(keyCode==KeyEvent.KEYCODE_ENTER){
                    String cityname=edt_city.getText().toString();
                    init(cityname);//加载
                }
                return false;
            }
        });
    }

    private void init(String cityname) {
        RequestQueue requestQueue= Volley.newRequestQueue(this);
        JsonObjectRequest stringRequest=new JsonObjectRequest("http://wthrcdn.etouch.cn/weather_mini?city="+cityname,null,
                new Response.Listener<JSONObject>(){
                    @Override
                    public void onResponse(JSONObject jsonObject) {
                        show(jsonObject);//进一步解析JSON数据的封装方法
                    }
                },new Response.ErrorListener(){

            @Override
            public void onErrorResponse(VolleyError volleyError) {
            }
        }){
            @Override
            protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {
                JSONObject jsonObject;
                try {
                    jsonObject=new JSONObject(new String(response.data,"UTF-8"));
                    return Response.success(jsonObject, HttpHeaderParser.parseCacheHeaders(response));
                } catch (JSONException e) {
                    e.printStackTrace();
                    return Response.error(new ParseError(e));
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                    return Response.error(new ParseError(e));
                }
            }
        };
        requestQueue.add(stringRequest);
    }

    private void show(JSONObject jsonObject) {
        try {
            JSONObject data=jsonObject.getJSONObject("data");//获取data详情
            JSONArray forecast=data.getJSONArray("forecast");//获取天气预报七天数组
            JSONObject today=forecast.getJSONObject(0);//获取今天的天气详情
            String wendu=data.getString("wendu");
            String fengxiang=today.getString("fengxiang");
            String fengli=today.getString("fengli");
            String high=today.getString("high");
            String low=today.getString("low");
            String type=today.getString("type");
            String date=today.getString("date");
            tv_show.setText("温度:"+wendu+"°\n" +
                    "风向:"+fengxiang+"\n" +
                    "风力:"+fengli+"\n" +
                    "最高温度:"+high+"\n" +
                    "最低温度:"+low+"\n" +
                    "天气:"+type+"\n" +
                    "日期:"+date);
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

    //按两次回退退出
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if(keyCode==KeyEvent.KEYCODE_BACK && event.getAction()==KeyEvent.ACTION_DOWN){
            if((System.currentTimeMillis()-exitTime) > 2000){
                Toast.makeText(getApplicationContext(), "再按一次退出程序", Toast.LENGTH_SHORT).show();
                exitTime = System.currentTimeMillis();
            } else {
                finish();
                System.exit(0);
            }
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }
}





  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值