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 ...
随机推荐
- HDU 3469 Catching the Thief (博弈 + DP递推)
Catching the Thief Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- 使用JDBC 插入向数据库插入对象
package com.ctl.util; import java.io.IOException; import java.lang.reflect.Field; import java.lang.r ...
- WebService注解汇总
Web Service 元数据注释(JSR 181) @WebService 1.serviceName: 对外发布的服务名,指定 Web Service 的服务名称:wsdl:service.缺省值 ...
- 理解ValueStack的基本机制
ValueStack基础:OGNL(Object Graphic Navigation Language) OGNL是Struts2中使用的一种表达式语言.它可以用于: · 在JSP页面,使用标签 ...
- C++明确规定,不能获取构造函数和析构函数的地址
C++标准明确规定,不能获取构造函数和析构函数的地址,因此也无法形成指向他们的成员函数指针. 指向成员函数的指针可以,指向构造函数析构函数的不行.因为构造函数和析构函数都是没有返回值的,无法声明一个没 ...
- 笔试题:求第M个到第N个素数之间全部素数
题目描写叙述 令Pi表示第i个素数. 现任给两个正整数M <= N <= 10000,请输出PM到PN的全部素数. 输入描写叙述: 输入在一行中给出M和N,其间以空格分隔. 输出描写叙述: ...
- ABAP JSON
1 DATA: lv_em TYPE string, lv_em1 TYPE string. DATA: lt_but021 TYPE TABLE OF but021, lt_but0211 TYPE ...
- mac下Android Studio干净卸载
1.卸载Android Studio,在终端(terminal)执行以下命令: rm -Rf /Applications/Android\ Studio.app rm -Rf ~/Library/Pr ...
- YTU 2911: 我想放假
2911: 我想放假 时间限制: 1 Sec 内存限制: 128 MB 提交: 124 解决: 46 题目描述 小明的弟弟上小学了,每次刚入学就想知道什么时候放假,但是每学期开学的日子和每学期的有 ...
- [原创]java导出word的5种方式
在网上找了好多天将数据库中信息导出到word中的解决方案,现在将这几天的总结分享一下.总的来说,java导出word大致有5种解决方案: 1:Jacob是Java-COM Bridge的缩写,它在Ja ...