今天就一个字,累!好久没有干这么长时间的活了,不过,也很开心。
今天的学习主要是学习了android中网络编程这一块,学习了发送HTTP请求的方法以及解析
XML和JSON数据的方法,直接上代码,代码上讲解已经很详细了!!!
public class MainActivity extends ActionBarActivity implements OnClickListener{
public static final int SHOW_RESPONSE=0;
private Button sendRequest;
private TextView responseText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sendRequest=(Button)findViewById(R.id.send_request);
responseText=(TextView)findViewById(R.id.respond_text);
sendRequest.setOnClickListener(this);
}
//Handler是在主线程中创建,所以会在主线程执行
//实现了由子线程向主线程的转变,解决了子线程不能更新UI的问题
private Handler handler=new Handler(){
public void handleMessage(Message msg)
{
switch (msg.what) {
case SHOW_RESPONSE:
String response=(String) msg.obj;
//在这里进行UI操作,将结果显示到桌面上
responseText.setText(response);
break;
default:
break;
}
}
};
public void onClick(View v)
{
if(v.getId()==R.id.send_request)
{
//使用HttpURLConnection的方法来发送请求
//sendRequestWithHttpURLConnection();
//使用HttpClient的方法来发送请求
sendRequestWithHttpClient();
}
}
//采用HttpClient来发送http请求
private void sendRequestWithHttpClient()
{
new Thread(new Runnable() {
@Override
public void run() {
//由于HttpClient是一个皆苦,所以无法创建它的实例。
//一般都会创建一个DefaultHttpClient
HttpClient httpClient=new DefaultHttpClient();
//发起一条get请求,创建一个HttpGet对象,并传入目标网络地址
//HttpGet httpGet=new HttpGet("http://www.baidu.com");
//Pull方式对XML文件进行解析
//指定访问的服务器地址是电脑本机
HttpGet httpGet=new HttpGet("http://127.0.0.1/get_data.xml");
HttpResponse httpResponse;
try {
//调用execute方法,执行返回一个httpResponse对象,服务器信息都在里面
httpResponse = httpClient.execute(httpGet);
if(httpResponse.getStatusLine().getStatusCode()==200)
{
//获取服务器返回的状态码,如果等于200就说明请求和响应都成功了
//调用getEntity方法获取一个HttpEntity实例
HttpEntity entity=httpResponse.getEntity();
//将获取的实例转换为字符串
String response=EntityUtils.toString(entity,"utf-8");
//最后通过Message对象传递给Handler来处理
// Message message=new Message();
// message.what=SHOW_RESPONSE;
// message.obj=response.toString();
// handler.sendMessage(message);
parseXMLWithSAX(response);
parseJSONWithJSONObject(response);
}
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}).start();
}
//采用HttpURLConnection的方式来发送Http请求
private void sendRequestWithHttpURLConnection()
{
//开启线程来发起网络请求
new Thread(new Runnable() {
@Override
public void run() {
//声明对象
HttpURLConnection connection=null;
try {
//创建URL对象,并且传入目标的网络地址
URL url=new URL("http://www.baidu.com");
//通过URL对象的openConnection方法来获的HttpURLConnection对象实例
connection=(HttpURLConnection) url.openConnection();
//设置HTTP请求的方法,设置的方法有两个,一个是GET,表示希望从服务器获取数据
//如果是POST,则是向服务器发送数据
connection.setRequestMethod("GET");
//设置连接超时
connection.setConnectTimeout(8000);
//设置读取超时
connection.setReadTimeout(8000);
//调用getInputStream获得返回服务器返回的输入流
InputStream in=connection.getInputStream();
//下面对获取到的输入流进行读取
BufferedReader reader=new BufferedReader(new InputStreamReader(in));
StringBuilder response=new StringBuilder();
String line;
while((line=reader.readLine())!=null)
{
response.append(line);
}
Message message=new Message();
//设置一个ID,用于Handler进行消息判别的一个依据
message.what=SHOW_RESPONSE;
//将服务器返回的结果存放到Message中
message.obj=response.toString();
//将结果发送给在主线程之中的Handler
handler.sendMessage(message);
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}finally
{
if(connection!=null)
{
connection.disconnect();
}
}
}
}).start();
}
//采用SAX方式对从服务器获得的数据进行解析
private void parseXMLWithSAX(String xmlData)
{
SAXParserFactory factory=SAXParserFactory.newInstance();
try {
//
XMLReader xmlReader=factory.newSAXParser().getXMLReader();
ContentHandler handler=new ContentHandler();
//最后将我们的实例设置到XMLReader中
xmlReader.setContentHandler(handler);
xmlReader.parse(new InputSource(new StringReader(xmlData)));
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//采用Pull的方式对从服务器获得数据进行解析
private void parseXMLWithPull(String xmlData)
{
try {
//获取一个XmlPullParserFactory实例,借助这个实例
//获得XmlPullParser对象
XmlPullParserFactory factor=XmlPullParserFactory.newInstance();
XmlPullParser xmlPullParser=factor.newPullParser();
//将服务器返回的数据设置进去,为下面的解析做准备
xmlPullParser.setInput(new StringReader(xmlData));
//获取当前的解析事件
int eventType=xmlPullParser.getEventType();
String id= "";
String name="";
String version="";
//如果当前的事件不等于XmlPullParser.END_DOCUMENT,则表示未解析完毕
while(eventType!=XmlPullParser.END_DOCUMENT)
{
String nodeName=xmlPullParser.getName();
switch (eventType) {
//判断是否为开始标签,如果是开始标签,则对内部数据进行解析
case XmlPullParser.START_TAG:{
if("id".equals(nodeName))
{
//获取节点的具体内容
id=xmlPullParser.nextText();
}else if ("name".equals(nodeName)) {
name=xmlPullParser.nextText();
}else if ("version".equals(nodeName)) {
version=xmlPullParser.nextText();
}
break;
}
//判断是否为结束标签,则打印出节点的具体内容
case XmlPullParser.END_TAG:
{
if("app".equals(nodeName))
{
Log.d("MainActivity","id is"+id);
Log.d("MainActivity","name is"+name);
Log.d("MainActivity","version is"+version);
}
}
default:
break;
}
eventType=xmlPullParser.next();
}
} catch (XmlPullParserException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//采用JSONObject的方式来解析JSON格式数据
/**
* 这种 方法是将服务器返回的数据传到了一个JSONArray的对象中,然后循环遍历这个JSONArray
* 从中取出的每一个元素都是一个JSONObject对象,每个对象又包含id、name、version
* 这些数据,接下来只需要使用getString()方法将数据取出即可。
* @param jsonData
*/
private void parseJSONWithJSONObject(String jsonData)
{
try {
JSONArray jsonArray=new JSONArray(jsonData);
for (int i=0;i<jsonArray.length();i++)
{
JSONObject jsonObject=jsonArray.getJSONObject(i);
String id=jsonObject.getString("id");
String name=jsonObject.getString("name");
String version=jsonObject.getString("version");
Log.d("MainActivity", "id is"+id);
Log.d("MainActivity", "name is"+name);
Log.d("MainActivity", "version is"+version);
}
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
采用SAX解析时候ContentHandler代码
public class ContentHandler extends DefaultHandler {
private String nodeName;
private StringBuilder id;
private StringBuilder name;
private StringBuilder version;
@Override
//获取节点中的内容时候调用
public void characters(char[] ch, int start, int length)
throws SAXException {
//根据当前的节点名判断将内容添加到哪一个StringBuilder对象中
if("id".equals(nodeName))
{
id.append(ch,start,length);
}else if ("name".equals(nodeName)) {
name.append(ch,start,length);
}else if ("version".equals(nodeName)) {
version.append(ch,start,length);
}
}
@Override
//完成整个XML解析的时候调用
public void endDocument() throws SAXException {
// TODO Auto-generated method stub
super.endDocument();
}
@Override
//解析完某个节点的时候调用
public void endElement(String uri, String localName, String qName)
throws SAXException {
if("app".equals(localName))
{
Log.d("ContentHandler","id is"+id.toString().trim());
Log.d("ContentHandler","name is"+name.toString().trim());
Log.d("ContentHandler","version is"+version.toString().trim());
//最后要将StringBuffer清空掉
id.setLength(0);
name.setLength(0);
version.setLength(0);
}
}
@Override
//开始解析XM时候调用
public void startDocument() throws SAXException {
//实例化三个对象
id=new StringBuilder();
name=new StringBuilder();
version=new StringBuilder();
}
@Override
//开始解析某个节点时候调用
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
//记录当前结点的名称
nodeName=localName;
}
}
明天加油,晚安!!!