网络通信框架Volley之二——访问服务器获取Json.xml数据和详细的解析数据

上一篇文章详细的说明如何获取网络图片的方法,本篇将详细的介绍如何访问服务器获取服务器返回的数据并且解析和显示。与服务器交互获取数据主要有json和xml两种格式,废话不多说,请看详解:

1.无图无真相。

2.详细的代码:

a.MainActivity

package com.example.volleydemo;


import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;


import com.lidroid.xutils.ViewUtils;
import com.lidroid.xutils.view.annotation.event.OnClick;


//Volley测试Demo
public class MainActivity extends Activity {
// 获取Xml,并且解析
@OnClick(R.id.get_Xml)
public void GetXml(View view) {
Intent intent = new Intent(this, GetXmlActivity.class);
startActivity(intent);
}


// 自定义获取Json,并且解析
@OnClick(R.id.get_Gson)
public void GetGson(View view) {
Intent intent = new Intent(this, GetGsonActivity.class);
startActivity(intent);
}


// JsonRequesrt获取Json,并且解析
@OnClick(R.id.get_Json)
public void GetJson(View view) {
Intent intent = new Intent(this, GetJsonActivity.class);
startActivity(intent);
}


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.fragment_main);
ViewUtils.inject(this);
}


}

b.GetXmlActivity

package com.example.volleydemo;


import java.io.IOException;
import java.util.ArrayList;
import java.util.List;


import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;


import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;


import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.Volley;


//获取Xml数据的界面
public class GetXmlActivity extends Activity {
private WeatherInfo weather;
private RequestQueue mQueue;
private List<WeatherInfo> list;
Handler handler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.arg1) {
case 1:
Log.i("list的大小:", list.size() + "");
for (int i = 0; i < list.size(); i++) {
Log.i("今天的天气:", list.get(2).getCity());
}
adapter = new Myadapter(GetXmlActivity.this, list);
listview.setAdapter(adapter);
break;


default:
break;
}
}


};
Myadapter adapter;
ListView listview;


@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 1.创建一个RequestQueue对象
mQueue = Volley.newRequestQueue(this);
list = new ArrayList<WeatherInfo>();
initRequestXml();
listview = (ListView) findViewById(R.id.listview);


}


private void initRequestXml() {
// 2.创建一个XmlRequest对象
XMLRequest xmlRequest = new XMLRequest(
"http://flash.weather.com.cn/wmaps/xml/china.xml",
new Response.Listener<XmlPullParser>() {


@Override
public void onResponse(XmlPullParser response) {
try {


for (int eventType = response.getEventType(); eventType != XmlPullParser.END_DOCUMENT; eventType = response
.next()) {
switch (eventType) {
case XmlPullParser.START_TAG:


String nodeName = response.getName();
if ("city".equals(nodeName)) {


weather = new WeatherInfo();
list.add(weather);
String pName = response
.getAttributeValue(0);
Log.d("TAG", "省份:" + pName);
weather.setShengfen(pName);
String citynameString = response
.getAttributeValue(2);
Log.d("TAG", "省会城市:" + citynameString);
weather.setCity(citynameString);
String stateDetailed = response
.getAttributeValue(5);
Log.d("TAG", "天气:" + stateDetailed);
weather.setWeatherstate(stateDetailed);
String tem1 = response
.getAttributeValue(6);
Log.d("TAG", "最高温度:" + tem1);
weather.setHeighttemp(tem1);
String tem2 = response
.getAttributeValue(7);
Log.d("TAG", "最低温度: " + tem2);
weather.setLowtemp(tem2);
String windState = response
.getAttributeValue(8);
Log.d("TAG", "风力:" + windState);
weather.setWindstate(windState);


}


break;
}


}


} catch (XmlPullParserException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
// 经过35遍的测试,必须发送消息才能获取到list
Message msg = Message.obtain();
msg.arg1 = 1;
handler.sendMessage(msg);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e("TAG", error.getMessage(), error);
}
});
//3. 添加XmlRequest到RequestQueue中
mQueue.add(xmlRequest);


}


class Myadapter extends BaseAdapter {
Context context;
List<WeatherInfo> list;


public Myadapter(Context context, List<WeatherInfo> list) {
this.context = context;
this.list = list;
}


public void addAll(List<WeatherInfo> list) {
list.addAll(list);
}


@Override
public int getCount() {
// TODO Auto-generated method stub
return list.size();
}


@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return list.get(position);
}


@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}


@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = View.inflate(context, R.layout.listitem, null);
TextView sheng = (TextView) view.findViewById(R.id.sheng);
sheng.setText(list.get(position).getShengfen());
TextView shi = (TextView) view.findViewById(R.id.shi);
shi.setText(list.get(position).getCity());
TextView tianqi = (TextView) view.findViewById(R.id.tianqi);
tianqi.setText(list.get(position).getWeatherstate());
TextView temp = (TextView) view.findViewById(R.id.temp);
temp.setText(list.get(position).getHeighttemp());
TextView feng = (TextView) view.findViewById(R.id.feng);
feng.setText(list.get(position).getWindstate());
return view;
}
}
}

c.GetJsonActivity

package com.example.volleydemo;


import org.json.JSONException;
import org.json.JSONObject;


import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;


import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonObjectRequest;
import com.android.volley.toolbox.Volley;


//获取Json格式的数据
public class GetJsonActivity extends Activity {
private RequestQueue mQueue;
private TextView tView;


@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_json);
tView = (TextView) findViewById(R.id.tv);


// 1.创建一个RequestQueue对象
mQueue = Volley.newRequestQueue(this);
initJsonRequest();
}


private void initJsonRequest() {
// 2.创建一个JsonObjectRequest对象
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(
"http://www.weather.com.cn/data/sk/101010100.html", null,
new Response.Listener<JSONObject>() {
// 请求成功监听
@Override
public void onResponse(JSONObject response) {
Log.d("TAG", response.toString());
// 返回的response是一个Json的数据
/**
* {"weatherinfo":{"SD":"40%","isRadar":"1","time":
* "14:15"
* ,"WSE":"3","WS":"3级","WD":"西南风","njd":"暂无实况","qy"
* :"1010"
* ,"Radar":"JC_RADAR_AZ9010_JB","temp":"27","cityid"
* :"101010100","city":"北京"}}
* */
// 先用optJSONObject()获取最外层weatherinfo,是一个JsonObject对象
JSONObject obj = response.optJSONObject("weatherinfo");// getString("weatherinfo");
try {
// 通过获取到的obj的getString方法获取object的每一个字段值
tView.setText(obj.getString("city") + "\n"
+ obj.getString("WD") + "\n"
+ obj.getString("time") + "\n"
+ obj.getString("temp") + "\n"
+ obj.getString("cityid"));
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
// 请求失败监听
@Override
public void onErrorResponse(VolleyError error) {
Log.e("TAG", error.getMessage(), error);
}
});
// 3.添加JsonObjectRequest对象到RequestQueue
mQueue.add(jsonObjectRequest);
}
}

d.自定义GetGsonActivity

package com.example.volleydemo;


import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;


import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.Volley;


//获取Json数据的界面
public class GetGsonActivity extends Activity {


private RequestQueue mQueue;
private TextView tView;


@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_json);
tView = (TextView) findViewById(R.id.tv);


// 1.创建一个RequestQueue对象
mQueue = Volley.newRequestQueue(this);
initGsonRequest();
}


private void initGsonRequest() {
// 2.创建一个JsonRequest对象
GsonRequest<Weather> gsonRequest = new GsonRequest<Weather>(
"http://www.weather.com.cn/data/sk/101010100.html",
Weather.class, new Response.Listener<Weather>() {
// 请求成功监听
@Override
public void onResponse(Weather weather) {
WeatherInfo weatherInfo = weather.getWeatherinfo();
Log.d("TAG", "city is " + weatherInfo.getCity());
Log.d("TAG", "temp is " + weatherInfo.getTemp());
Log.d("TAG", "time is " + weatherInfo.getTime());
tView.setText(weatherInfo.getCity() + "\n"
+ weatherInfo.getTemp() + "\n"
+ weatherInfo.getTime());
}
}, new Response.ErrorListener() {
// 请求失败监听
@Override
public void onErrorResponse(VolleyError error) {
Log.e("TAG", error.getMessage(), error);
}
});
// 3. 添加JsonRequest到RequestQueue中
mQueue.add(gsonRequest);


}
}

e.实体类WeatherInfo 

package com.example.volleydemo;


//天气实体类
public class WeatherInfo {
// 省份
private String shengfen;
// 城市
private String city;
// 天气
private String weatherstate;
// 最高气温
private String heighttemp;
// 最低气温
private String lowtemp;
// 风力
private String windstate;
// 时间
private String time;
public String getTime() {
return time;
}


public void setTime(String time) {
this.time = time;
}


public String getTemp() {
return temp;
}


public void setTemp(String temp) {
this.temp = temp;
}


// 温度
private String temp;


public String getShengfen() {
return shengfen;
}


public void setShengfen(String shengfen) {
this.shengfen = shengfen;
}


public String getCity() {
return city;
}


public void setCity(String city) {
this.city = city;
}


public String getWeatherstate() {
return weatherstate;
}


public void setWeatherstate(String weatherstate) {
this.weatherstate = weatherstate;
}


public String getHeighttemp() {
return heighttemp;
}


public void setHeighttemp(String heighttemp) {
this.heighttemp = heighttemp;
}


public String getLowtemp() {
return lowtemp;
}


public void setLowtemp(String lowtemp) {
this.lowtemp = lowtemp;
}


public String getWindstate() {
return windstate;
}


public void setWindstate(String windstate) {
this.windstate = windstate;
}


@Override
public String toString() {
return "WeatherInfo [shengfen=" + shengfen + ", city=" + city
+ ", weatherstate=" + weatherstate + ", heighttemp="
+ heighttemp + ", lowtemp=" + lowtemp + ", windstate="
+ windstate + ", time=" + time + ", temp=" + temp + "]";
}


}

f.

package com.example.volleydemo;


public class Weather {
private WeatherInfo weatherinfo;


public WeatherInfo getWeatherinfo() {
return weatherinfo;
}


public void setWeatherinfo(WeatherInfo weatherinfo) {
this.weatherinfo = weatherinfo;
}
}

g.

package com.example.volleydemo;


import java.io.UnsupportedEncodingException;


import com.android.volley.NetworkResponse;
import com.android.volley.ParseError;
import com.android.volley.Request;
import com.android.volley.Request.Method;
import com.android.volley.Response;
import com.android.volley.Response.ErrorListener;
import com.android.volley.Response.Listener;
import com.android.volley.toolbox.HttpHeaderParser;
import com.google.gson.Gson;
//自定义获取Json
public class GsonRequest<T> extends Request<T> {


private final Listener<T> mListener;


private Gson mGson;


private Class<T> mClass;


public GsonRequest(int method, String url, Class<T> clazz,
Listener<T> listener, ErrorListener errorListener) {
super(method, url, errorListener);
mGson = new Gson();
mClass = clazz;
mListener = listener;
}


public GsonRequest(String url, Class<T> clazz, Listener<T> listener,
ErrorListener errorListener) {
this(Method.GET, url, clazz, listener, errorListener);
}


@Override
protected Response<T> parseNetworkResponse(NetworkResponse response) {
try {
String jsonString = new String(response.data,
HttpHeaderParser.parseCharset(response.headers));
return Response.success(mGson.fromJson(jsonString, mClass),
HttpHeaderParser.parseCacheHeaders(response));
} catch (UnsupportedEncodingException e) {
return Response.error(new ParseError(e));
}
}


@Override
protected void deliverResponse(T response) {
mListener.onResponse(response);
}


}

h.

package com.example.volleydemo;


import java.io.StringReader;
import java.io.UnsupportedEncodingException;


import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;


import com.android.volley.NetworkResponse;
import com.android.volley.ParseError;
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.Response.ErrorListener;
import com.android.volley.Response.Listener;
import com.android.volley.toolbox.HttpHeaderParser;


//自定义获取XmlRequest
public class XMLRequest extends Request<XmlPullParser> {// 使用Pull解析的方式来解析XML


private final Listener<XmlPullParser> mListener;


public XMLRequest(int method, String url, Listener<XmlPullParser> listener,
ErrorListener errorListener) {
super(method, url, errorListener);
mListener = listener;
}


public XMLRequest(String url, Listener<XmlPullParser> listener,
ErrorListener errorListener) {
this(Method.GET, url, listener, errorListener);
}


// 将服务器响应的数据解析成一个字符串
@Override
protected Response<XmlPullParser> parseNetworkResponse(
NetworkResponse response) {
try {
String xmlString = new String(response.data,
HttpHeaderParser.parseCharset(response.headers));
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlPullParser xmlPullParser = factory.newPullParser();
xmlPullParser.setInput(new StringReader(xmlString));
return Response.success(xmlPullParser,
HttpHeaderParser.parseCacheHeaders(response));
} catch (UnsupportedEncodingException e) {
return Response.error(new ParseError(e));
} catch (XmlPullParserException e) {
return Response.error(new ParseError(e));
}
}


// 将XmlPullParser对象进行回调
@Override
protected void deliverResponse(XmlPullParser response) {
mListener.onResponse(response);
}


}

好了,今天的实例已经完了,关于获取网络数据这一问题你看了实例,问题应该不大,用到的开源框架有Vlley.xUtils,Gson.源码Demo请在我空间下载。

猜你喜欢

转载自blog.csdn.net/jackiandroid/article/details/39647733