android服务端客户端(三)
2016-01-23 15:10
447 查看
上一节做了表单上传图片到服务端的demo。这一节来做从服务端下载图片的demo。
服务端,在BeautyDao中写一个在数据库中查询所有beauty的方法——queryAll()。
构造一个GetAllBeautyServlet,客户端通过请求服务端,获得服务端返回的json数据,通过解析json数据获得其中的entity,从而达到下载的目的。
通过queryAll查询出所有beauty,将查询出的信息转成类似下面的json数据:
{ beauties:[ {id:1,name:\"bobo\",description:\"xxx\",imagename:\"xxx\"},
{},{} ] }
转变思路:[ {} , {} , {} ] ,客户端就可以以数组的方式处理这个json数据。
接下来我们要构建android客户端代码。点击按钮实现下载。
android端程序也需要一个beauty实体,基本跟服务端的Beauty实体一致。
点击按钮,采用异步任务实现下载。
要注意这里的请求路径,打开cmd窗口,通过ip config -all 命令查询ip地址,因为我这里是通过adb connect将手机连接到电脑,所以使用的是无线网络的ip。
回到服务端,构建一个GetImageByNameServlet,根据图片名称获得图片数据
在android端,就可以通过这个Servlet获得bitmap,在Beauty实体中增加一个属性bitmap,用来设置bitmap数据。
我们在界面中增加一个listview用来显示下载的数据。写一个Adapter。
在onPostExecute方法中setAdapter。
记得加上联网权限:<uses-permission android:name="android.permission.INTERNET"/>
服务端,在BeautyDao中写一个在数据库中查询所有beauty的方法——queryAll()。
// 查询所有的beauty public List<Beauty> queryAll() { List<Beauty> beauties = new ArrayList<Beauty>(); try { // 获得连接 Connection conn = DBUtil.getConn(); PreparedStatement pst = conn.prepareStatement("select * from beauty"); ResultSet rs = pst.executeQuery(); while (rs.next()) { girls.add(new Beauty(rs.getInt(1), rs.getString(2), rs.getString(3), rs.getString(4))); } // 关闭资源 DBUtil.close(conn, pst, rs); } catch (Exception e) { e.printStackTrace(); } return beauties; }
构造一个GetAllBeautyServlet,客户端通过请求服务端,获得服务端返回的json数据,通过解析json数据获得其中的entity,从而达到下载的目的。
通过queryAll查询出所有beauty,将查询出的信息转成类似下面的json数据:
{ beauties:[ {id:1,name:\"bobo\",description:\"xxx\",imagename:\"xxx\"},
{},{} ] }
转变思路:[ {} , {} , {} ] ,客户端就可以以数组的方式处理这个json数据。
StringBuffer sb = new StringBuffer(); sb.append("["); for (int i = 0; i <= list.size() - 1; i++) { Girl g = list.get(i); if (i == list.size() - 1) { // 如果是最后一个,后面就没有,号 sb.append("{id:" + g.getId() + ",name:\"" + g.getName() + "\",description:\"" + g.getDescription() + "\",imagename:\"" + g.getImageName() + "\"}"); }else{ sb.append("{id:" + g.getId() + ",name:\"" + g.getName() + "\",description:\"" + g.getDescription() + "\",imagename:\"" + g.getImageName() + "\"},"); } } sb.append("]"); String jsonContent = sb.toString(); //输出给客户端 resp.setContentType("text/html;charset=UTF-8"); resp.getWriter().write(jsonContent);
接下来我们要构建android客户端代码。点击按钮实现下载。
android端程序也需要一个beauty实体,基本跟服务端的Beauty实体一致。
点击按钮,采用异步任务实现下载。
要注意这里的请求路径,打开cmd窗口,通过ip config -all 命令查询ip地址,因为我这里是通过adb connect将手机连接到电脑,所以使用的是无线网络的ip。
public class MyTask extends AsyncTask<Void, Void, Void> { @Override protected Void doInBackground(Void... params) { // 开始连接网络。 /* * URL和HttpClient都能实现网络连接。 * 但是HttpClient实现的过程更简单,所以我们采用HttpClient实现网络连接。 */ String path = "http://192.168.1.101:8080/TT_Server/GetAllBeautyServlet"; // 创建客户端(打开浏览器) HttpClient client = new DefaultHttpClient(); // 构造post或者get请求。 HttpGet get = new HttpGet(path); HttpResponse response = null; try { response = client.execute(get); if (response.getStatusLine().getStatusCode() == 200) { // 正确获得数据。 String jsonContent = EntityUtils.toString( response.getEntity(), "UTF-8"); Log.i("TT",jsonContent ); } } catch (Exception e) { e.printStackTrace(); } return null; } @Override protected void onPostExecute(Void result) { } }通过第三方jar包解析获得的json数据。这里采用fastjson.jar。需要下载的请点fastjson.jar下载
回到服务端,构建一个GetImageByNameServlet,根据图片名称获得图片数据
//获取客户端发送来的图片名称 String imageName = req.getParameter("imageName"); //通过输入流读进来 FileInputStream fis = new FileInputStream("C:\\"+imageName); ByteArrayOutputStream bos = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int len = 0; while ((len=fis.read(buffer))!=-1) { bos.write(buffer,0,len); } byte[] allData = bos.toByteArray(); //关闭资源 fis.close(); bos.close(); //将图片发送到客户端 resp.getOutputStream().write(allData);
在android端,就可以通过这个Servlet获得bitmap,在Beauty实体中增加一个属性bitmap,用来设置bitmap数据。
beauties = (List<Beauty>) JSON.parseArray(jsonContent,Beauty.class); for (Beauty beauty : beauties) { // Log.i("TZ",beauty.toString() ); // 获得妹子的图片名称,然后下载图片数据。 String getImagePath = "http://192.168.1.101:8080/TT_Server/GetImageByNameServlet?imageName=" + beauty.getImageName(); HttpGet imageGet = new HttpGet(getImagePath); HttpResponse imageResponse = client.execute(imageGet); if (imageResponse.getStatusLine().getStatusCode() == 200) { Bitmap bitmap = BitmapFactory .decodeStream(imageResponse.getEntity() .getContent()); girl.setBitmap(bitmap); } }异步任务实际上是封装了线程和Handler的功能,分别可以用来连接网络和更新UI。在doInBackground方法中连接网络,在onPostExecute更新UI。
我们在界面中增加一个listview用来显示下载的数据。写一个Adapter。
@Override public View getView(int position, View convertView, ViewGroup parent) { View root=inflater.inflate(R.layout.sister_layout, null); ImageView imageView=(ImageView)root.findViewById(R.id.image); TextView tvName=(TextView)root.findViewById(R.id.tvName); TextView tvDescription=(TextView)root.findViewById(R.id.tvDescription); Girl g = girls.get(position); imageView.setImageBitmap(g.getBitmap()); tvName.setText( g.getName() ); tvDescription.setText( g.getDescription() ); return root; }
在onPostExecute方法中setAdapter。
@Override protected void onPostExecute(Void result) { if (girls != null) { // 将girls的内容显示到桌面。 mAdapter = new MySisterAdapter(girls, MainActivity.this); listView.setAdapter(mAdapter); } }
记得加上联网权限:<uses-permission android:name="android.permission.INTERNET"/>
相关文章推荐
- Android使用Palette把drawable转为bitmap图像大小改变的问题
- 4000 Google Map for Android 官方API 学习与解析
- Android Mms专题
- JavaScript 通过 WebView 调用 Android Text to Speech API
- android高级框架xUtils之BitmapUtils
- Android培训笔记
- android细节之禁用activity的系统的默认切换效果
- Android多种方法获取系统时间
- Android 几个学习用到的网址
- Android seekBar1.自定义样式
- Android 判断摄像头权限方法
- android彩信数据字段
- android高级框架xUtils之DbUtils
- Android控件的继承关系
- Android之ProgressDialog
- Android之AlertDialog
- Android Service完全解析,关于服务你所需知道的一切(下)
- Android随时随地退出程序
- Android知晓当前是在哪一个活动
- android 改变输入法enter键文字 为搜索 下一个 以及前往