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 ...
随机推荐
- 把A表中的a字段和b字段数据 复制到B表中的aa字段和bb字段
insert into tab2 (column1,column2) select column1,column2 from tab1
- java中 ++前后差别试题及静态变量一旦赋值不可改变
package javaTest; public class Increment { private static int k=0; public static void main(String[] ...
- 书评第003篇:《0day安全:软件漏洞分析技术(第2版)》
本书基本信息 丛书名:安全技术大系 作者:王清(主编),张东辉.周浩.王继刚.赵双(编著) 出版社:电子工业出版社 出版时间:2011-6-1 ISBN:9787121133961 版次:1 页数:7 ...
- Real-Time Compressive Tracking 论文笔记
总体思想 1 利用符合压缩感知RIP条件的随机感知矩阵对多尺度图像进行降维 2 然后对降维的特征採用简单的朴素贝叶斯进行分类 算法主要流程 1 在t帧的时候,我们採样得到若干张目标(正样本)和背景(负 ...
- hdu 4970 Killing Monsters(数组的巧妙运用) 2014多校训练第9场
pid=4970">Killing Monsters ...
- POI异步导入Excel兼容xsl和xlsx
项目架构:spring+struts2+hibernate4+oracle 需求:用户导入excel文件,导入到相应的数据表中,要求提供导入模板,支持xls和xlsx文件 思路分析: 1.提供一个下载 ...
- div+css通用兼容性代码整理
一.Div+css通用兼容性代码 你可以在css开头加入 *html{padding:0px} <style> *html{padding:0px} /* Clear Fix */ .cl ...
- 织梦仿站列表页pagelist分页显示竖排,如何修改成横排?
织梦仿站列表页pagelist分页显示竖排,如何修改成横排? 织梦列表页的分页标签是采用pagelist来进行调用的,但是很多人在调用之后会出现一个列表竖着排列的问题(横排美观度好一些),还是非常不美 ...
- lua 与C通过c api传递table
此文转自http://blog.csdn.net/perfect2011/article/details/19200511(感谢...) 首先了解下c++与lua之间的通信: 假设在一个lua文件中有 ...
- 适用于PHP初学者的学习线路和建议
[导读] 这篇文章是围绕PHP的学习问题,之前介绍过<重磅资料!Github上的PHP资源汇总大全><深入探讨PHP类的封装与继承><PHP的学习规划建议>等对PH ...