概述
以及郭霖的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);
}
}