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与服务器端数据交互的更多相关文章

  1. Android开发学习---android下的数据持久化,保存数据到rom文件,android_data目录下文件访问的权限控制

    一.需求 做一个类似QQ登录似的app,将数据写到ROM文件里,并对数据进行回显. 二.截图 登录界面: 文件浏览器,查看文件的保存路径:/data/data/com.amos.datasave/fi ...

  2. Android开发学习——android数据存储

    Android的存储 Android中的数据存储方式及其存储位置 SharedPrefrence存储 1). 位置           /data/data/packageName/shared_pr ...

  3. Android开发学习——android存储

    Android的存储 内部存储空间RAM内存:运行内存,相当于电脑的内存ROM内存:存储内存,相当于电脑的硬盘外部存储空间 SD卡:相当于电脑的移动硬盘    * 2.2之前,sd卡路径:sdcard ...

  4. Android开发学习——android体系结构

    Android的体系结构采用了分层架构的思想, 从上层到底层共包括四层,分别是应用程序程序层.应用框架层.系统库和Android运行时和Linux内核. 一 应用程序层 该层提供一些核心应用程序包,例 ...

  5. Android开发学习——Android项目的目录结构

    Android项目的目录结构: 资源文件夹: 清单配置文件: Android的四大组件在使用前全部需要在清单文件中配置 <?xml version="1.0" encodin ...

  6. Android开发学习——Android Studio配置SVN

    一.基本配置 1. 下载这个,然后双击 安装,按下图这样选 然后 傻瓜式安装 2. 进入Android studio设置:Use Command Line Client 选择浏览到第1步你本地安装 T ...

  7. android开发学习 ------- android studio 同时用svn和git 进行代码管理 出现的问题

    svn和git的工作机制:  SVN 是集中式或者有中心式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以首先要从中央服务器哪里得到最新的版本,然后干活,干完后,需要 ...

  8. android开发学习——android studio 引入第三方库的总结

    http://www.jianshu.com/p/0c592fff5d89 总结的很溜

  9. Android开发学习——android反编译

    第一种: 1.下载下边的三个jar包,对dex2jar和jd-gui进行解压 2.将需要反编译的apk后缀名改为.rar,然后进行解压 3.将解压后生成的classes.dex加入第一步解压后的dex ...

随机推荐

  1. cf246 ENew Reform (并查集找环)

    Berland has n cities connected by m bidirectional roads. No road connects a city to itself, and each ...

  2. 关于Android中物理按键不响应的可能的一个问题。

    今天在工作中犯了一个错误,写的视频播放器突然物理音量键就不起作用了. 一開始以为是自己定义的音量条把系统的物理音量条按键给屏蔽掉了. 删除自己定义的音量条还是不行,又怀疑是是加入了什么权限之类的.重复 ...

  3. python3 安装 #zlib zlibmodule.c -I$(prefix)/include -L$(exec_prefix)/lib -lz

    #zlib zlibmodule.c -I$(prefix)/include -L$(exec_prefix)/lib -lz Modules/Setup.dist https://askubuntu ...

  4. 每天进步一点点—mysql-mysqldump

    一.        简单介绍 mysqldump是client用来备份数据库或者在不通数据库之间进行数据迁移的工具,备份内容包括创建表或者装载表的SQL语句 二.       命令格式   备份单个数 ...

  5. HDU3974 Assign the task —— dfs时间戳 + 线段树

    题目链接:https://vjudge.net/problem/HDU-3974 There is a company that has N employees(numbered from 1 to ...

  6. git lfs

    https://git-lfs.github.com/ 1.从这个网址下载git-lfs-windows-amd64-1.1.0.exe,运行这个安装包 2.然后打开git bash 输入git lf ...

  7. aapt的常用命令

    1. 列出apk包的内容 aapt l[ist] [-v] [-a] file.{zip,jar,apk} -v 以table形式列出来 -a 详细列出内容 例如:aapt l <你的apk文件 ...

  8. 并不对劲的bzoj3277

    陈年老坑 题意大概是有n个字符串,要求出每一个字符串的所有子串(不包括空串)在所有字符串(包括自身)中出现次数不少于k的有多少个.n,k,字符串总长<=100000. 如果只有一个串的话,非常好 ...

  9. bzoj1858 [Scoi2010]序列操作——线段树

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1858 线段树...调了一个上午...(后面带 // 的都是改出来的) lazy 标记的下放好 ...

  10. VS2013文件同步插件开发

    一.插件功能描述 插件监控一个xml文件,当该文档有添加新元素在保存的时候将新增的元素同步到指定的目录下. 二.模板的选择 由于该功能是跟代码编辑有关的,要监控文档的保存事件,所以要在文档打开的时候就 ...