文档章节

android访问服务器并解析返回的XML和JSON数据

ht896632
 ht896632
发布于 2016/03/02 14:07
字数 1066
阅读 46
收藏 1
点赞 2
评论 0

1.模拟服务器

a.新建一个JAVAWEB项目,也就是这里要充当的服务器,模拟一个业务,并且返回一个XML类型的数据,当然后JSON也行,但是这里我先使用XML,JSON格式的 后续进行实现。下面图片是通过访问服务器返回的XML数据


b.新建一个android项目,访问服务器,并解析服务器返回的数据

1.新建一个实体类

/**
 * 实体bean,用来将解析后的数据封装为对象
 */
public class News {
	private Integer id;
	private String title;
	private Integer timelength;
	public News(){
		
	}
	public News(Integer id, String title, Integer timelength) {
		this.id = id;
		this.title = title;
		this.timelength = timelength;
	}
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public Integer getTimelength() {
		return timelength;
	}
	public void setTimelength(Integer timelength) {
		this.timelength = timelength;
	}
}
2.访问服务器地址,解析数据

import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

import org.xmlpull.v1.XmlPullParser;

import android.util.Xml;

import cn.kafei.bean.News;

public class NewsService {
    /**
     * 获取最新视频资讯
     */
    public static List<News> getListNews() throws Exception {
        // 服务器地址URL,在操作系统上测试访问项目时使用localhost(127.0.0.1)进行访问,但在这里需要将localhost(127.0.0.1)替换为
        // 本机在局域网或者外网中的IP地址。因为android和WEB项目运行在不同的平台上
        String path = "http://192.168.1.109:8080/ListServlet";
        URL url = new URL(path);// 构建一个URL对象
        HttpURLConnection con = (HttpURLConnection) url.openConnection();// 打开连接
        con.setConnectTimeout(5000);// 设置超时时间
        con.setRequestMethod("GET");// 设置请求方式
        if (con.getResponseCode() == 200) {// 判断是否请求成功,状态码为200
            InputStream inStream = con.getInputStream();
            return parseXML(inStream);
        }
        return null;
    }

    /**
     * 解析服务器返回的XML数据
     * 
     * @param inStream
     */
    private static List<News> parseXML(InputStream inStream) throws Exception {
        List<News> newList = new ArrayList<News>();
        News news = null;
        XmlPullParser parser = Xml.newPullParser();
        parser.setInput(inStream, "UTF-8");
        int event = parser.getEventType();
        while (event != XmlPullParser.END_DOCUMENT) {
            switch (event) {
            case XmlPullParser.START_TAG:
                if ("news".equals(parser.getName())) {
                    int id = new Integer(parser.getAttributeValue(0));
                    news = new News();
                    news.setId(id);
                } else if ("title".equals(parser.getName())) {
                    news.setTitle(parser.nextText());
                } else if ("timelength".equals(parser.getName())) {
                    news.setTimelength(new Integer(parser.nextText()));
                }
                break;
            case XmlPullParser.END_TAG:
                if ("news".equals(parser.getName())) {
                    newList.add(news);
                    news = null;
                }
                break;
            }
            event = parser.next();
        }
        return newList;
    }
}
3.将数据显示在ListView中,至于ListView显示数据这里不在进行介绍,请访问我之前发表的博文 ListView绑定数据

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import cn.kafei.bean.News;
import cn.kafei.service.NewsService;

import android.app.Activity;
import android.os.Bundle;
import android.widget.ListView;
import android.widget.SimpleAdapter;

public class NewsActivity extends Activity {
	private ListView listView = null;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		listView = (ListView) this.findViewById(R.id.listView);// listView显示控件
		try {
			List<News> news = NewsService.getListNews();// 获取服务器请求返回的数据信息
			List<HashMap<String, Object>> data = new ArrayList<HashMap<String, Object>>();
			for (News n : news) {
				HashMap<String, Object> item = new HashMap<String, Object>();
				item.put("id", n.getId());
				item.put("title", n.getTitle());
				item.put(
						"timelength",
						getResources().getString(R.string.timeLength)
								+ n.getTimelength()
								+ getResources().getString(R.string.min));
				data.add(item);
			}
			SimpleAdapter adapter = new SimpleAdapter(this, data,
					R.layout.item, new String[] { "title", "timelength" },
					new int[] { R.id.title, R.id.timelength });
			listView.setAdapter(adapter);// 将SimpleAdapter适配器将数据绑定在ListView上
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

4.解析JSON的方法

/**
	 * 获取服务器端JSON格式数据
	 */
	public static List<News> getListNewsJson() throws Exception {
		// 服务器地址URL,在操作系统上测试访问项目时使用localhost(127.0.0.1)进行访问,但在这里需要将localhost(127.0.0.1)替换为
		// 本机在局域网或者外网中的IP地址。因为android和WEB项目运行在不同的平台上
		String path = "http://192.168.1.109:8080/ListServlet?format=json";
		URL url = new URL(path);// 构建一个URL对象
		HttpURLConnection con = (HttpURLConnection) url.openConnection();// 打开连接
		con.setConnectTimeout(5000);// 设置超时时间
		con.setRequestMethod("GET");// 设置请求方式
		if (con.getResponseCode() == 200) {// 判断是否请求成功,状态码为200
			InputStream inStream = con.getInputStream();
			return parseJSON(inStream);
		}
		return null;
	}

	/**
	 * 解析JSON数据
	 * @param inStream
	 * @return
	 * @throws IOException 
	 */
	private static List<News> parseJSON(InputStream inStream) throws Exception {
		List<News> newsList=new ArrayList<News>();
		byte[] data=read(inStream);
		String json=new String(data);
		JSONArray array=new JSONArray(json);
		for (int i=0;i<array.length();i++) {
			JSONObject jsonObject=array.getJSONObject(i);
			News news=new News(jsonObject.getInt("id"), jsonObject.getString("title"), jsonObject.getInt("timelength"));
			newsList.add(news);
		}
		return newsList;
	}

	/**
	 * 读取流中的数据
	 */
	public static byte[] read(InputStream inputStream) throws IOException {
		ByteArrayOutputStream outputStream=new ByteArrayOutputStream();
		byte[] b=new byte[1024];
		int len=0;
		while((len=inputStream.read(b))!=-1){
			outputStream.write(b);
		}
		inputStream.close();
		return outputStream.toByteArray();
	}
服务端组件JSON字符串:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		List<News> news=service.getListNews();
		String format=request.getParameter("format");
		if("json".equals(format)){
			StringBuilder builder=new StringBuilder();
			builder.append('[');
			for(News n:news){
				builder.append('{');
				builder.append("id:").append(n.getId()).append(',');
				builder.append("title:\"").append(n.getTitle()).append("\",");
				builder.append("timelength:").append(n.getTimelength());
				builder.append("},");
			}
			builder.deleteCharAt(builder.length()-1);
			builder.append(']');
			//将新闻放到request对象中
			request.setAttribute("json", builder.toString());
			request.getRequestDispatcher("/WEB-INF/page/newsjson.jsp").forward(request, response);
		}else{
		//将新闻放到request对象中
		request.setAttribute("news", news);
		//用转发将数据显示的页面上
		request.getRequestDispatcher("/WEB-INF/page/news.jsp").forward(request, response);
		}
	}


5.显示效果


源码下载地址:android访问网络源码

© 著作权归作者所有

共有 人打赏支持
ht896632
粉丝 35
博文 53
码字总数 31361
作品 0
闵行
高级程序员
android客户端访问服务端tomcat

首先,服务器端已经存在一个项目,该项目基于SSH,已经部署在tomcat上并且正在运行了.我在这个项目的action层新建了一个包,该包主要是Struts2的一些action,只是这些action不是返回某些view,而是...

蜡笔小小小新
2015/11/11
0
0
Android PackageManagerService的启动过程分析

在Android中,有几个比较重要的Service。 ActivityManagerService-------主要负责管理所有的Activity的逻辑 WindowManagerService-------主要负责Android中窗口相关的逻辑 PackageManagerSe...

恰同学少年
2015/08/03
0
0
使用Android API最佳实践

本文由 伯乐在线 - imesong 翻译自 meetme。欢迎加入Android小组。转载请参见文章末尾处的要求。 写在前面 现在,Android应用程序中集成第三方API已十分流行。应用程序都有自己的网络操作和缓...

mingxun
2014/04/17
0
0
[工具安装使用] [okHttp] okHttp client测试用例

说明: 之前此工程是用于测试webView的,所以工程名不是叫okHttpClient. Server之前文章已经有提到如何搭建了,见 Windows上Apache服务器的下载和安装 流程是从apache server读取一个文件jso...

kris_fei
05/11
0
0
开发自己的监控系统三、移动篇(android)

开发自己的监控系统一、email篇 开发自己的监控系统二、web篇 移动篇(android) 关键字:java、android、json、php 互联网已经进入大数据时代,如果没有给自己的产品开发手机端的应用程序,...

cszer
2013/06/09
0
1
Android四款系统架构工具

Spring for Android   Spring for Android是Spring框架在Android平台上的扩展,旨在简化Android原生应用的开发流程,提高开发者的工作效率。Spring for Android可以帮助开发者简化应用与服...

zhwj407906450
2014/10/21
0
0
android自愿目录assets与res/raw的不同

android资源目录---assets与res/raw的不同 转载 http://blog.csdn.net/hshm20517/article/details/6461890 assets:用于存放需要打包到应用程序的静态文件,以便部署到设备中。与res/raw不同点...

哈全文
2012/04/23
0
0
Android push (一):SMS push

Android push (一):SMS push 移动终端为了节省电量和网络流量,不再采用轮训服务器的方式来收集数据,而是在服务器有数据需要发送到终端时通知终端。我们称这种机制叫推送(push)。终端接...

LiSteven
2013/06/04
0
1
Android客户端与服务器交互方式-小结

最近的Android项目开发过程中一个问题困扰自己很长时间,Android客户端与服务器交互有几种方式,最常见的就是webservices和json。要在Android手机客户端与pc服务器交互,需要满足下面几种条件...

x-knight_勋爵
2016/04/18
0
0
Android异步下载图片并且缓存图片到本地

在Android开发中我们经常有这样的需求,从服务器上下载xml或者JSON类型的数据,其中包括一些图片资源,本demo模拟了这个需求,从网络上加载XML资源,其中包括图片,我们要做的解析XML里面的数...

liuher
2014/07/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

sleep与wait的区别

Thread.sleep(XXX)方法消耗CPU吗? 这个知识点是我之前认识一直有错误的一个知识点,在我以前的认识里面,我一直认为Thread.sleep(1000)的这一秒钟的时间内,线程的休眠是一直占用着CPU的时间...

码代码的小司机
10分钟前
0
0
20位活跃在Github上的国内技术大牛 leij 何小鹏 亚信

本文列举了20位在Github上非常活跃的国内大牛,看看其中是不是很多熟悉的面孔? 1. lifesinger(玉伯) Github主页: https://github.com/lifesinger 微博:@ 玉伯也叫射雕 玉伯(王保平),...

海博1600
14分钟前
0
0
Mybatis收集配置

一、Mybatis取Clob数据 1、Mapper.xml配置 <resultMap type="com.test.User" id="user"> <result column="id" property="id"/> <result column="json_data" property="jsonData" ......

星痕2018
40分钟前
0
0
centos7设置以多用户模式启动

1、旧版本linux系统修改inittab文件,在新版本执行vi /etc/inittab 会有以下提示 # inittab is no longer used when using systemd. # # ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON......

haha360
今天
0
0
OSChina 周日乱弹 —— 局长:怕你不爱我

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @ andonny :分享周二珂的单曲《孤独她呀》 《孤独她呀》- 周二珂 手机党少年们想听歌,请使劲儿戳(这里) @孤星闵月 :没事干,看一遍红楼梦...

小小编辑
今天
192
9
Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式 Factory工厂模式 Singleton单例模式 Delegate委派模式 Strategy策略模式 Prototype原型模式 Template模板模式 Spring5 beans 接口实例化 代理Bean操作 ...

小致dad
今天
0
0
SpringBoot | 第十章:Swagger2的集成和使用

前言 前一章节介绍了mybatisPlus的集成和简单使用,本章节开始接着上一章节的用户表,进行Swagger2的集成。现在都奉行前后端分离开发和微服务大行其道,分微服务及前后端分离后,前后端开发的...

oKong
今天
11
0
Python 最小二乘法 拟合 二次曲线

Python 二次拟合 随机生成数据,并且加上噪声干扰 构造需要拟合的函数形式,使用最小二乘法进行拟合 输出拟合后的参数 将拟合后的函数与原始数据绘图后进行对比 import numpy as npimport...

阿豪boy
今天
17
0
云拿 无人便利店

附近(上海市-航南路)开了家无人便利店.特意进去体验了一下.下面把自己看到的跟大家分享下. 经得现场工作人员同意后拍了几张照片.从外面看是这样.店门口的指导里强调:不要一次扫码多个人进入....

周翔
昨天
1
0
Java设计模式学习之工厂模式

在Java(或者叫做面向对象语言)的世界中,工厂模式被广泛应用于项目中,也许你并没有听说过,不过也许你已经在使用了。 简单来说,工厂模式的出现源于增加程序序的可扩展性,降低耦合度。之...

路小磊
昨天
254
1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部