Android开发学习——android与服务器端数据交互
1.首先搭建服务器端。
使用MyEclipse开发工具
public class MyServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
ArrayList<Food> food = new ArrayList<Food>();
Gson g = new Gson();
Food f1 = new Food(1,"1111","1111","/cinema_1.jpg");
Food f2 = new Food(2,"2222","22222","/cinema_2.jpg");
Food f3 = new Food(3,"3333","33333","/food_1.jpg");
Food f4 = new Food(4,"44444","4444","/food_2.jpg");
Food f5 = new Food(5,"55555","5555","/hotel_1.jpg");
food.add(f1);
food.add(f2);
food.add(f3);
food.add(f4);
food.add(f5);
boolean isNextPage = false;
Map<String,Object> map = new HashMap<String,Object>();
map.put("foodList", food);
map.put("isNextPage", isNextPage);
resp.setContentType("text/html;charset=utf-8");
PrintWriter out = resp.getWriter();
out.print(g.toJson(map));
out.close();
}
}
上述代码所需的Food实体如下:
public class Food implements Serializable{
private int id;
private String name;
private String desc;
private String imgPath;
public Food(int id, String name, String desc, String imgPath) {
super();
this.id = id;
this.name = name;
this.desc = desc;
this.imgPath = imgPath;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
public String getImgPath() {
return imgPath;
}
public void setImgPath(String imgPath) {
this.imgPath = imgPath;
}
}
我们在浏览器中访问

可以获取到结果,说明服务器端是正常的。
2.服务器端搭建好了之后,我们搭建android端
public class MainActivity extends Activity {
private ListView lv;
private List<Food> data = new ArrayList<Food>();
private MyAdapter mAdapter;
private ProgressDialog pd;
private boolean isNextPage;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv = (ListView) findViewById(R.id.lv);
pd = new ProgressDialog(this);
mAdapter = new MyAdapter(this, data);
lv.setAdapter(mAdapter);
new MyFoodTask().execute();
}
private class MyFoodTask extends AsyncTask<String, Void, Map<String,Object>>{
@Override
protected void onPreExecute() {
pd.setMessage("Loading...");
}
@Override
protected Map<String, Object> doInBackground(String... params) {
String path = "http://10.0.2.2:8080/TestWeb/bbb";
HttpClient client = new DefaultHttpClient();
HttpGet get = new HttpGet(path);
try {
HttpResponse resp = client.execute(get);
if(resp.getStatusLine().getStatusCode()==200){
HttpEntity entity = resp.getEntity();
String result = EntityUtils.toString(entity);
Log.i("111", "result="+result);
Map<String,Object> map = parseJson(result);
return map;
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Map<String, Object> result) {
pd.dismiss();
isNextPage = (Boolean) result.get("isNextPage");
data.addAll( (List<Food>) result.get("foodList") );
mAdapter.notifyDataSetChanged();
for(int i = 0;i<data.size();i++){
Food f = data.get(i);
new MyImgTask().execute(f);
}
}
private Map<String,Object> parseJson(String json) throws Exception{
Map<String ,Object> result = new HashMap<String,Object>();
List<Food> lists = new ArrayList<Food>();
JSONObject bigObj = new JSONObject(json);
result.put("isNextPage", bigObj.getBoolean("isNextPage"));
JSONArray array = bigObj.getJSONArray("foodList");
Food f = null;
for(int i =0 ;i<array.length();i++){
f = new Food();
JSONObject smallObj = array.getJSONObject(i);
f.setId( smallObj.getInt("id") );
f.setName( smallObj.getString("name") );
f.setDesc(smallObj.getString("desc"));
f.setImgPath( smallObj.getString("imgPath") );
lists.add(f);
}
result.put("foodList", lists);
return result;
}
private class MyImgTask extends AsyncTask<Food, Void, Food>{
@Override
protected Food doInBackground(Food... params) {
Food f = params[0];
String imgPath = "http://10.0.2.2:8080/TestWeb"+f.getImgPath();
HttpClient client = new DefaultHttpClient();
HttpGet get = new HttpGet(imgPath);
try {
HttpResponse resp = client.execute(get);
if(resp.getStatusLine().getStatusCode()==200){
HttpEntity entity = resp.getEntity();
byte img [] = EntityUtils.toByteArray(entity);
f.setImgData(img);
}
} catch (Exception e) {
e.printStackTrace();
}
return f;
}
@Override
protected void onPostExecute(Food result) {
mAdapter.notifyDataSetChanged();
}
}
}
}
所需的Food实体:
public class Food implements Serializable{
private int id;
private String name;
private String desc;
private String imgPath;
private byte imgData [];
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
public String getImgPath() {
return imgPath;
}
public void setImgPath(String imgPath) {
this.imgPath = imgPath;
}
public byte[] getImgData() {
return imgData;
}
public void setImgData(byte[] imgData) {
this.imgData = imgData;
}
}
所需的适配器:
public class MyAdapter extends BaseAdapter{
private Context context;
private List<Food> data ;
public MyAdapter(Context context, List<Food> data) {
this.context = context;
this.data = data;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return data.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return data.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) {
if(convertView==null){
convertView = LayoutInflater.from(context).inflate(R.layout.item, null);
}
ImageView iv_img = (ImageView) convertView.findViewById(R.id.iv_img);
TextView tv_name = (TextView) convertView.findViewById(R.id.tv_name);
TextView tv_desc = (TextView) convertView.findViewById(R.id.tv_desc);
Food food = data.get(position);
if(food.getImgData()==null){
iv_img.setImageResource(R.drawable.cinema_1);
}else{
byte [] imgData = food.getImgData();
Bitmap bm = BitmapFactory.decodeByteArray(imgData, 0, imgData.length);
iv_img.setImageBitmap(bm);
}
tv_name.setText( food.getName());
tv_desc.setText( food.getDesc());
return convertView;
}
}
我们启动模拟器,得到运行结果:

有兴趣的同学, 可以尝试自己做一下。
Android开发学习——android与服务器端数据交互的更多相关文章
- Android开发学习---android下的数据持久化,保存数据到rom文件,android_data目录下文件访问的权限控制
一.需求 做一个类似QQ登录似的app,将数据写到ROM文件里,并对数据进行回显. 二.截图 登录界面: 文件浏览器,查看文件的保存路径:/data/data/com.amos.datasave/fi ...
- Android开发学习——android数据存储
Android的存储 Android中的数据存储方式及其存储位置 SharedPrefrence存储 1). 位置 /data/data/packageName/shared_pr ...
- Android开发学习——android存储
Android的存储 内部存储空间RAM内存:运行内存,相当于电脑的内存ROM内存:存储内存,相当于电脑的硬盘外部存储空间 SD卡:相当于电脑的移动硬盘 * 2.2之前,sd卡路径:sdcard ...
- Android开发学习——android体系结构
Android的体系结构采用了分层架构的思想, 从上层到底层共包括四层,分别是应用程序程序层.应用框架层.系统库和Android运行时和Linux内核. 一 应用程序层 该层提供一些核心应用程序包,例 ...
- Android开发学习——Android项目的目录结构
Android项目的目录结构: 资源文件夹: 清单配置文件: Android的四大组件在使用前全部需要在清单文件中配置 <?xml version="1.0" encodin ...
- Android开发学习——Android Studio配置SVN
一.基本配置 1. 下载这个,然后双击 安装,按下图这样选 然后 傻瓜式安装 2. 进入Android studio设置:Use Command Line Client 选择浏览到第1步你本地安装 T ...
- android开发学习 ------- android studio 同时用svn和git 进行代码管理 出现的问题
svn和git的工作机制: SVN 是集中式或者有中心式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以首先要从中央服务器哪里得到最新的版本,然后干活,干完后,需要 ...
- android开发学习——android studio 引入第三方库的总结
http://www.jianshu.com/p/0c592fff5d89 总结的很溜
- Android开发学习——android反编译
第一种: 1.下载下边的三个jar包,对dex2jar和jd-gui进行解压 2.将需要反编译的apk后缀名改为.rar,然后进行解压 3.将解压后生成的classes.dex加入第一步解压后的dex ...
随机推荐
- Cocos2d-x 3.1.1 学习日志12--一Cocos2dx3.1.1移植到Android平台的方法(最实用最有效的!!)
须要用到工具(依照顺序): 1.JDK 2.NDK 3.ANT 4.Adt-bundle-windows 将JDK文件夹下的bin文件夹路径加入到系统环境变量中. 解压NDK 解压Adt-bundle ...
- hdu 4902 Nice boat--2014 Multi-University Training Contest 4
题目链接:http://acm.hdu.edu.cn/showproblem.php? pid=4902 Nice boat Time Limit: 30000/15000 MS (Java/Othe ...
- quick-cocos2d-x教程10:实现血条效果。
血条是常见功能.能够通过一个血条背景和一个不断改变的血条宽度.来实现少血. 在MainScence.lua中,先改代码: function MainScene:ctor() local bg ...
- 识别IE11浏览器
现在俺们做的系统十分高大上,用IE的话非要上IE11或以上版本. 咋检测呢?检测到用户用IE.且IE低于IE11的话就提示他升级浏览器呢?可以酱紫: var _IE = (function (d, w ...
- mac上为nginx打开防火墙
1 nginx的路径必须是物理路径,不能是链接 2 执行下面的两个命令后重启电脑 命令 sudo /usr/libexec/ApplicationFirewall/socketfilterfw --a ...
- Poi 操作 Excel
http://blog.csdn.net/chenglc1612/article/details/53413445 一. POI简介 Apache POI是Apache软 ...
- UVA11324 The Largest Clique —— 强连通分量 + 缩点 + DP
题目链接:https://vjudge.net/problem/UVA-11324 题解: 题意:给出一张有向图,求一个结点数最大的结点集,使得任意两个结点u.v,要么u能到达v, 要么v能到达u(u ...
- YTU 2811: 打鱼还是晒网
2811: 打鱼还是晒网 时间限制: 1 Sec 内存限制: 128 MB 提交: 192 解决: 150 题目描述 中国有句俗话"三天打鱼,两天晒网".小王从2000年的1月 ...
- codeforces 688A A. Opponents(水题)
题目链接: A. Opponents time limit per test 1 second memory limit per test 256 megabytes input standard i ...
- 苹果Instruments/Shark性能调试工具概述
在Mac OS X上你可以使用Gprof这样的UNIX工具用于测试程序性能.当然,Apple也有自己的Profiling Tools,用得比较多的是Shark.10.5里还引入了一个基于DTrace的 ...