在日志(1)中我们简谈了客户端和服务器端的数据交互问题
所以,在此将对数据的传输类型做深入介绍
在我们的目标中,客户端以普通的post方式提交数据,所以提交数据的格式一般是字符串类型
但是有时候我我们会提交图片数据,所以,我们引入一个bitmap和string相互转换的类
public class Bitmap_String { /** * 图片转成string * * @param bitmap * @return */ public static String convertIconToString(Bitmap bitmap) { ByteArrayOutputStream baos = new ByteArrayOutputStream();// outputstream bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos); byte[] appicon = baos.toByteArray();// 转为byte数组 return Base64.encodeToString(appicon, Base64 .DEFAULT); } /** * string转成bitmap * * @param st */ public static Bitmap convertStringToIcon(String st) { // OutputStream out; Bitmap bitmap = null; try { // out = new FileOutputStream("/sdcard/aa.jpg"); byte[] bitmapArray; bitmapArray = Base64.decode(st, Base64.DEFAULT); bitmap =BitmapFactory.decodeByteArray(bitmapArray, 0, bitmapArray.length); // bitmap.compress(Bitmap.CompressFormat.PNG, 100, out); return bitmap; } catch (Exception e) { return null; } } }但是,在我们一般手机相片转换成string的长度是以百万级算的,而我们对于好友头像之类的头像并不是需要特别高清,一般是显示缩略图,所以有时候我们可以对bitmap图片进行压缩,谷歌也提供了压缩图片的方式,我们只要进行稍微的编写就可以完成图片压缩功能
//压缩图片 public Bitmap transImage(Bitmap bitmap, int width, int height) { int bitmapWidth = bitmap.getWidth(); int bitmapHeight = bitmap.getHeight(); // 缩放图片的尺寸 float scaleWidth = (float) width / bitmapWidth; float scaleHeight = (float) height / bitmapHeight; Matrix matrix = new Matrix(); matrix.postScale(scaleWidth, scaleHeight); // 产生缩放后的Bitmap对象 Bitmap resizeBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmapWidth, bitmapHeight, matrix, false); return resizeBitmap; }
我们只要这样transImage(bitmapMy,100,100)就可以把bitmap图片转换成的字符串长度缩略成万级的,虽然有些图片压缩之后是效果不尽人意,但是我们可以改变 width 和 height 的大小来得到我们需要的效果这样我们就可以把图片当作字符串转换给服务器端了在服务器端中,图片的字符串可以转换成byte[]类型的数据,以便我们存储在数据库中的image类型字段,字符串转byte[].可以有多个选择,其中Unicode和ascii类型转换都可以,但是在提取图片时要进行相应格式的转换1、System.Text.UnicodeEncoding converter = new System.Text.UnicodeEncoding();byte[] inputBytes =converter.GetBytes(inputString);string inputString = converter.GetString(inputBytes);2、string inputString = System.Convert.ToBase64String(inputBytes);byte[] inputBytes = System.Convert.FromBase64String(inputString);C#中我们可以把数据列表转换成jsonarray格式的字符串再传递给客户端string friendList= JsonConvert.SerializeObject(list数据).ToString(); Response.Write("{\"friendsList\":"+friendList+"}");在客户端中private JSONArray friendList=null;friendList= response.getJSONArray("friendsList");然后我们就可以把jsonarray数据转换成list列表绑定到我们的listview中android studio 中默认使用的是 org.json而org.json 中并不包含 net.sf.json 中的toList()和.toCollection()方法,所以我们可以导入net.sf.json包,但是我们要把org.json的包删除,不然会引入重复而出错,当然我们也可以使用谷歌的gson我使用的是原自带的org.json,所以得自己编写toList()方法,public class JsonArrayToList { public List<PersonBean> toList(JSONArray jsonArray) throws JSONException { JSONObject jsonObject; List<PersonBean> list = new ArrayList<PersonBean>(); if(jsonArray!=null){ for (int i = 0; i < jsonArray.length(); i++) { jsonObject = jsonArray.getJSONObject(i); list.add(getMap(jsonObject)); }} return list; } public static PersonBean getMap(JSONObject jsonObject) { try { @SuppressWarnings("unchecked") Iterator<String> keyIter = jsonObject.keys(); String key; String value; PersonBean valueMap = new PersonBean(); while (keyIter.hasNext()) { key = (String) keyIter.next(); value = jsonObject.get(key).toString(); if(key.equals("usersId")){ valueMap.setUsersId(Integer.parseInt(value)); continue; } if(key.equals("password")){ valueMap.setPassword(value); continue; } if(key.equals("userName")){ valueMap.setUserName( value); continue; } if(key.equals("userImg")){ valueMap.setUserImg( value); continue; } } return valueMap; } catch (JSONException e) { e.printStackTrace(); } return null; } }好了,我们这就可以完成我的信息的创建和修改,我的好友列表的加载功能了此博文为个人日志文档
欢迎大神给修改意见
邮箱 1159828111@qq.com